#include<iostream>
#include<cstring>
#include<string>  //getline在这里
#define maxn 1000000
#define hasn 1000003
using namespace std;
typedef int st[9];
st queue[maxn];
int dir[2][4] = {0,0,-1,1,1,-1,0,0};//下、右、上、左
char *prnt = "rlud";
int path[maxn],dr[maxn],head[hasn],nxt[maxn];  // 不能用next
st goal = {1,2,3,4,5,6,7,8,0};
st o;
int fnd[4] = {2,1,3,0};  //0,2,3,1
int Hash(st a){int res = 0;for(int i = 0;i<9;i++){res = res*10+a[i];}return res%hasn;
}
int try_to_insert(int rear){
//  st tp = queue[rear];int h = Hash(queue[rear]);int u = head[h];while(u){if(!memcmp(queue[rear],queue[u],sizeof(o))){return 0;}u = nxt[u];  //next存放的是在queue中的下标 }nxt[rear] = head[h];head[h] = rear;return 1;
}
int bfs(){memset(head,0,sizeof(head));memcpy(queue[1],o,sizeof(o));int front = 1,rear = 2;while(front<rear){if(!memcmp(queue[front],goal,sizeof(goal))){return front;}int x,y,k;for(int i = 0;i<9;i++){if(queue[front][i]==0){k = i;break;}}x = k/3,y = k%3;for(int z = 0;z<4;z++){int i = fnd[z];int xx = x+dir[0][i],yy = y+dir[1][i];if(xx>=0&&xx<3&&yy>=0&&yy<3){memcpy(&queue[rear],&queue[front],sizeof(o));queue[rear][k] = queue[rear][xx*3+yy];queue[rear][xx*3+yy] = 0;if(try_to_insert(rear)){dr[rear] = i;path[rear] = front;rear++;}}}front ++; }return 0;
}
void back_print(int ans){//递归打印 if(ans == 1){return;}back_print(path[ans]);// for(int i=0;i<9;i++){
//      if(i&&i%3==0){
//          printf("\n");
//      }
//      printf("%d ",queue[ans][i]);
//  }printf("%c",prnt[dr[ans]]);
}
int main(){string s;while(getline(cin,s,'\n')){int len = s.length(),k=0;for(int i = 0;i<len;i++){if(s[i]=='x'){o[k++] = 0;}else if(s[i]>='0'&&s[i]<='8'){o[k++] = s[i]-'0';}}int ans;if((ans = bfs())){back_print(ans);printf("\n");}else{printf("unsolvable\n");}}return 0;
}

八数码 BFS+HASH相关推荐

  1. 移动拼图游戏(八数码问题) BFS版

    小时候玩过的移动拼图游戏.有一个3*3的棋盘,其中有0-8这9个数字,0表示空格,每次移动只能把空格旁边的数字移到空格,即与0相邻的数字可以和0交换位置. 求从初始状态 2 3 0 7 1 6 5 8 ...

  2. Poj 1077 eight(BFS+全序列Hash解八数码问题)

    一.题意 经典的八数码问题,有人说不做此题人生不完整,哈哈.给出一个含数字1~8和字母x的3 * 3矩阵,如: 1  2  X            3 4  6            7  5  8 ...

  3. 习题:八数码难题(双向BFS)

    八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...

  4. hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数

    题意: 题意就是八数码,给了一个3 * 3 的矩阵,上面有八个数字,有一个位置是空的,每次空的位置可以和他相邻的数字换位置,给你一些起始状态 ,给了一个最终状态,让你输出怎么变换才能达到目的. 思路: ...

  5. 【 HDU1043-经典BFS+康拓展开 八数码】 (待更)

    给定一个序列,由1~8数字和字母x组成,表示的是一个3*3的矩形.每次操作x都能与相邻的数字交换,问如何操作才能使得序列为{1,2,3,4,5,6,7,8,x}. //多组数据-需要计算全部路径后直接 ...

  6. 人工智能作业 八数码启发式搜索与bfs比较

    问题描述 3×3九宫棋盘,放置数码为1 -8的8个棋牌,剩下一个空格,只能通过棋牌向空格的移动来改变棋盘的布局. 要求:根据给定初始布局(即初始状态)和目标布局(即目标状态),如何移动棋牌才能从初始布 ...

  7. C++解题报告:详解经典搜索难题——八数码问题( 双向BFS A* 求解)

    引言 AC这道八数码问题,你和楼教主就是兄弟了... 题目描述 在一个3*3的九宫格棋盘里,放有8个数码,数码的数字分别是1~8.棋盘中还有一个位置是空着的,用0表示.可以通过在九宫格里平移数码来改变 ...

  8. 【八数码问题】基于状态空间法的知识表示与状态搜索:无信息搜索(BFS/DFS) 启发式搜索(A*)

    前言 一.问题引入 二.状态空间法 1. 知识及其表示 2. 状态空间法定义 3. 问题求解 三.基于状态空间搜索法解决八数码问题 1. 八数码问题的知识表示 2. 状态空间图搜索 1. 无信息搜索 ...

  9. AcWing 845. 八数码(3阶数字华容道):bfs求最短路,状态表示困难

    文章目录 题目 题目分析 题目 题目链接:AcWing 845. 八数码(数字华容道) 在一个3×3的网格中,1~8这8个数字和一个"x"恰好不重不漏地分布在这3×3的网格中. 例 ...

最新文章

  1. RabbitMQ 入门系列(7)— 如何保证 RabbitMQ 高可用性
  2. 7怎么导入中文文献_如何下载并引用参考文献?
  3. 内存分析工具MAT的使用
  4. boost::mp11::mp_fold相关用法的测试程序
  5. SQL Server 2005两本教程案例数据库
  6. JavaScript的检测及其数据类型
  7. C++ opengl 矩阵的压栈与出栈
  8. better-scroll 与 Vue 结合
  9. 【连载】如何掌握openGauss数据库核心技术?秘诀五:拿捏数据库安全(2)
  10. 虚拟主机 webdav php,ubuntu 搭建 webdav 文件服务器 及客户端配置 详解
  11. Java中string中hashcode_Java String中的hashCode实现
  12. 【Flutter 问题系列第 25 篇】Flutter 使用自定义字体
  13. 求解线性方程的数值方法——Matlab中实现算法
  14. ⭐算法入门⭐《广度优先搜索》中等01 —— LeetCode 994. 腐烂的橘子
  15. 自控原理学习笔记---控制系统稳定性分析
  16. Android 如何禁用scheme跳转其他app
  17. android 7.0原生room,小米5S 安卓9.0 原生体验 LineageOS16.0 ROOT
  18. uniapp 消息推送与透传+语音播报
  19. 计算机音乐文献,论音乐文献计算机编郭小株.pdf
  20. 是时候关注ZGC和昏暗的Nashorn的明星了:Java影响者参与其中

热门文章

  1. 【毕业设计】基于STM32 的电子计步器的设计与实现 - 物联网 单片机 嵌入式
  2. java applet类开始博饼_中秋博饼demo
  3. 编程求ax2+bx+c=0的解
  4. 科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生
  5. 微信支付后台通知频率
  6. hz和分贝怎么转换_分贝转换
  7. 2022 SWPUCTF Web+Crypto方向wp
  8. 免费赠送BTC和iPhone XS 揭开YEX虚拟盘的面纱
  9. 毛笔笔刷书法签名手写字体设计 Brightwall – Brush Signature Font
  10. 【SQL学习笔记】《SQL进阶教程》1.2