八数码 || 九宫重排

废话:
这道题如果我们用bfs确实可以跑,但是大概率会炸掉,这道题是可以双向bfs,但今天我要展示的是用A*搜索的代码

策略分析:

1,标记:
既然是搜索,那我们就肯定就要加标记,来避免重复搜索,这里是九个格子,我们假定就是0,那么这个九宫格的每一个状态都可以用一个int数据来表示,这是我们很容易就想到了用 map<int,bool>映射作为标记我们已经访问过的点.

map<int,bool> vis;

2,A*启发式搜索:
A*的思想并不难,就是在选择下一个要搜索的点时,优先选择实际代价+估算代价最小的点来搜索,这里具体的A*思路我就不说了,这里有个视频讲得非常好,可以去看看:一看就懂的 A*寻路算法讲解 启发式搜索入门
3,估算距离:
这里的估算距离我用的是当前每个数字(除0以外,因为每次1-8的数字移动空格都会一起移动)到对应数字终点的曼哈顿距离即:

预估距离=|x1-x2|+|y1-y2|

4,优先队列与结构体:
要用A*来搜,当然就得会优先队列来存储准备搜索的点,由于个人爱好,我比较喜欢用重载小于符号的方式来写优先队列,step就是我们要用的实际代价(步数),juli是估算代价(估算的剩余步数),x当然就是代表的这个九宫格的数字位置状态嘛

struct cpp{int x,juli,step;bool operator<(const cpp &a)const{if(a.juli==juli && a.step==step)return x>a.x;return step+juli>a.step+a.juli;//由于优先队列是大的在前面}                                  //但我们为了让小的在前面就这样写
}tem;priority_queue<cpp> dui;//优先队列

5,int数字状态转为char[3][3]数组:
我们把int转为char[3][3]数组当然是为了更好地理解代码,移动空格方块

inline void num_ju(int &a){for(int i=2;i>=0;i--){for(int j=2;j>=0;j--){tem_ju[i][j]=a%10;a/=10;if(tem_ju[i][j]==0)xx0=i,yy0=j;}}
}

6,char[3][3]数组转为int数字状态:

inline int ju_num(char a[][3]){int num=0;for(int i=0;i<3;i++){for(int j=0;j<3;j++){num*=10;num+=a[i][j];}}return num;
}

具体代码

欢迎各位在评论区指正或提问

#include <iostream>
#include <string>
#include<vector>
#include <algorithm>
#include<stdlib.h>
#include<cmath>
#include<map>
#include<stdio.h>
#include<queue>
using namespace std;
struct cpp{int x,juli,step;bool operator<(const cpp &a)const{if(a.juli==juli && a.step==step)return x>a.x;return step+juli>a.step+a.juli;}
}tem;priority_queue<cpp> dui;
int kai,jie;
map<int,bool> vis;
char kai_ju[3][3],jie_ju[3][3],tem_ju[3][3];
int mhd_jie[10];
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int xx0,yy0;void initi(){char kaitem[10],jietem[10];scanf("%s\n%s",kaitem,jietem);for(int i=0;i<9;i++){kai*=10,jie*=10;if(kaitem[i]>'0' && kaitem[i]<'9'){kai+=kaitem[i]-'0';kai_ju[i/3][i%3]=kaitem[i]-'0';}else{kai_ju[i/3][i%3]=0;}if(jietem[i]>'0' && jietem[i]<'9'){jie+=jietem[i]-'0';jie_ju[i/3][i%3]=jietem[i]-'0';mhd_jie[jietem[i]-'0']=i;}else{jie_ju[i/3][i%3]=0;}}vis[kai]=1,vis[jie]=1;
}inline int mhd_juli(char a[][3]){int juli=0;for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(a[i][j]!=0)juli+=abs(mhd_jie[(int)a[i][j]]/3-i)+abs(mhd_jie[(int)a[i][j]]%3-j);}}return juli;
}inline void num_ju(int &a){for(int i=2;i>=0;i--){for(int j=2;j>=0;j--){tem_ju[i][j]=a%10;a/=10;if(tem_ju[i][j]==0)xx0=i,yy0=j;}}
}inline int ju_num(char a[][3]){int num=0;for(int i=0;i<3;i++){for(int j=0;j<3;j++){num*=10;num+=a[i][j];}}return num;
}int main(){initi();tem.x=kai,tem.juli=mhd_juli(kai_ju),tem.step=0;dui.push(tem);int res,xxx,yyy,tem_num,tem_step;while(!dui.empty()){res=dui.top().x;tem_step=dui.top().step;dui.pop();num_ju(res);for(int i=0;i<4;i++){xxx=xx0+dx[i],yyy=yy0+dy[i];if(xxx>=0 && xxx<3 && yyy>=0 && yyy<3){swap(tem_ju[xxx][yyy],tem_ju[xx0][yy0]);tem_num=ju_num(tem_ju);if(tem_num==jie){printf("%d",tem_step+1);return 0;}if(vis[tem_num]==0){vis[tem_num]=1;tem.x=tem_num;tem.step=tem_step+1;tem.juli=mhd_juli(tem_ju);dui.push(tem);}swap(tem_ju[xx0][yy0],tem_ju[xxx][yyy]);}}}cout<<"-1";return 0;
}

题目链接:九宫重排

八数码 || 九宫重排(A*搜索代码)相关推荐

  1. 八数码问题的广度优先搜索方法

    八数码问题的广度优先搜索方法 问题的简单描述 3×3九宫qipan,放置数码为1 -8的8个棋子,剩下一个空格,只能通过向空格的移动来改变九宫格的布局. 要求:根据给定初始布局(即初始状态)和目标布局 ...

  2. 【人工智能】八数码问题:广度搜索、深度搜索

    应用广度搜索BFS和深度搜索DFS解决八数码问题,广度搜索和深度搜索都是盲目搜索,相关理论知识,算法过程:问题求解:状态空间图和盲目搜索. 参考:7种方法求解八数码问题 Python实现A*算法解决N ...

  3. 历届试题 九宫重排 广度优先搜索+康拓排序

    历届试题 九宫重排   时间限制:1.0s   内存限制:256.0MB        问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移 ...

  4. 八数码问题——双向广度优先搜索解决

    八数码问题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所看到的,要求对空格运行空格左移.空格右移.空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态. 搜索 ...

  5. 蓝桥杯-九宫重排 (搜索)

    问题描述:在九宫格中放置8个数,有一个为空格.给定初始状态九宫格,和目标状态九宫格,问需要多少步可以将初始状态变成目标状态.如果无法达到输出-1,如果可以达到,输出最少的步骤数. 问题分析:本题属于搜 ...

  6. python 九宫重排_[蓝桥杯][历届试题]九宫重排 (Python代码)(bfs+集合)

    ac代码..可是官网还有两组没过.. ```python from collections import deque class Node(): def __init__(self, arr, ste ...

  7. 制作重排九宫游戏c语言,九宫重排 (C++代码)

    //使用哈希技术,提高检索效率,哈哈哈 #include #include using namespace std; typedef int State[9]; const int MAXSTATE  ...

  8. 8puzzle java 代码_八数码难题(8 puzzle)深度优先和深度优先算法

    1搜索策略 搜索策略是指在搜索过程中如何选择扩展节点的次序问题.一般来说,搜索策略就是采用试探的方法.它有两种类型:一类是回溯搜索,另一类是图搜索策略. 2盲目的图搜索策略 图搜索策略又可分为两种:一 ...

  9. 历届试题 九宫重排 (bfs 八数码问题)

    问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

最新文章

  1. 美多商城之用户中心(添加和验证邮箱)
  2. 看哭了:程序员界有哪些经典的笑话?
  3. 新时代大视频产业的底座,视频云创变了什么?
  4. 第一次用access的数据库是连接字符串问题
  5. Pytorch —— 学习率调整策略
  6. prettier 指“北”
  7. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第2节 TCP协议_1_TCP通信的概述(上)...
  8. ubuntu18.04安装中文输入法ibus
  9. cad批量打印_CAD不懂批量打印的进来 详细讲解一下
  10. oracle查询本周本月本季本年时间
  11. 北航计算机专业怎么样考研好考不,计算机专业考研,北航和北邮各有什么优势...
  12. 对话洪小文:微软为什么能够持续保持竞争力和创新力?
  13. 企微有客户流失提醒功能吗?如何设置?
  14. android水电工具softonic,Softonic
  15. c语言 自动计时的秒表,c语言实现的简单秒表计时器
  16. Python:实现字符串Z 函数或 Z 算法(附完整源码)
  17. 微信js 大转盘抽奖
  18. 期货资管分仓软件——期货子账户软件的构成架构以及实现的功能
  19. cmseasy(易通CMS) 注入漏洞 上传漏洞 爆路径ODAY(含修复)
  20. 好心情:长期服用抗抑郁药,怎么把肝损伤降到最低?

热门文章

  1. VS2010 混合模式程序集是针对v1.1.4322版的运行时生成的 在没有配置其他信息的情况下 无法再4.0运行中
  2. JDK8 源码包 外加注释
  3. 嵌入式设备中OpenCV的移植
  4. 精准填报志愿、一分不浪费……靠谱吗?
  5. babylon101| 08. Cameras, Mesh Collisions and Gravity(相机、碰撞和重力)
  6. python永久删除文件_Python彻底删除文件夹及其子文件方式
  7. [LetCode-1438] 绝对差不超过限制的最长连续子数组
  8. 眼睛怎么画?怎样才能画好人物的眼睛?
  9. 如何加声调口诀_汉语拼音声调标注口诀 涨知识了
  10. Java开发必读--初识微服务一定要阅读这篇文章