经典的八数码问题
来源:互联网 发布:mac移动硬盘无法读取 编辑:程序博客网 时间:2024/06/06 01:40
问题描述:
在一个3*3的方棋盘上放置着1,2,3,4,5,6,7,8八个数码,每个数码占一格,且有一个空格。这些数码可以在棋盘上移动,其移动规则是:与空格相邻的数码方格可以移入空格。现在的问题是:对于指定的初始棋局和目标棋局,给出数码的移动序列。该问题称八数码难题或者重排九宫问题。
问题思路:
这可以看做是一个隐式图搜索问题,把每一次移动一格子的分布认为是一个状态图,空格记为0,并认为移动格子的时候,移动的是0这一个格子和另外的格子交换。我在这里使用典型的BFS算法来判断是否能到达目标状态,并且给出多少步。
#include<iostream>#include<algorithm>#include<cstring>#include<set>using namespace std;typedef int state[9];const int maxn=1000000;state st[maxn],goal;int dist[maxn];int front,rear;const int dx[]={-1,1,0,0};const int dy[]={0,0,-1,1};set<int> vis;int try_to_insert(int pos)//判断重复{ int tmp=0; for(int i=0;i<9;i++) tmp=tmp*10+st[pos][i];//把状态图计算为一个9位的独一无二的数字存在set中 if(vis.count(tmp)) return 0; vis.insert(tmp); return 1;}int bfs(){ vis.clear(); front=1,rear=2; while(front<rear) { state &s=st[front]; if(memcmp(goal,s,sizeof(s))==0) return front; int i,j,x,y; for(i=0;i<9;i++) if(s[i]==0) break;//找到0这一格所在位置,把状态的变化看作是0这一格的移动 x=i/3,y=i%3; for(j=0;j<4;j++) { int newx=x+dx[j]; int newy=y+dy[j]; if(newx>=0&&newx<3&&newy>=0&&newy<3) { state &v=st[rear]; memcpy(&v,&s,sizeof(s)); v[x*3+y]=v[newx*3+newy]; v[newx*3+newy]=0; dist[rear]=dist[front]+1; if(try_to_insert(rear)) rear++;//判断是否出现重复状态 } } front++; }}int main(){ for(int i=0;i<9;i++) cin>>st[1][i]; for(int i=0;i<9;i++) cin>>goal[i]; int d=bfs(); if(d>0) cout<<dist[d]<<endl; else cout<<"-1"<<endl; return 0;}
输入:
2 6 4 1 3 7 0 5 8
8 1 5 7 3 6 4 0 2
输出:
31
1 0
- 经典的八数码问题
- POJ1077(经典的八数码问题)
- 八数码问题 经典搜索 bfs
- 入门经典-p133-八数码问题
- 八数码问题 bfs 算法入门经典
- hdu 1043 Eight 经典八数码问题
- 八数码问题的可解性
- 八数码问题的可解行
- 八数码问题的解决方案
- 八数码经典
- hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数
- 算法竞赛入门经典 7.5.3 八数码问题
- hdu 1043 八数码 经典搜索问题 BFS+MAP
- 算法竞赛入门经典 7.5.3 八数码问题
- [算法入门经典] 7.5.3 八数码问题 | HDU 1043
- poj 1077 Eight(经典八数码问题:bfs/Dbfs)
- 八数码问题(状态空间搜索)--《算法入门经典》
- 算法入门经典第二版第七章八数码问题
- 软件设计原则——复习感想
- 10 table—index—inode:深入buffer pool
- ORA-19906: recovery target incarnation changed during recovery
- MapReduce的input为小文件和har文件的相关实验
- memcpy(&gdt,(void*)(*((u32*)(&gdt_ptr[2]))),*((u16*)(&gdt_ptr[0])) + 1)中参数的理解
- 经典的八数码问题
- 黑马程序员_面向对象总结(部分)
- GO 语言写的加密算法(附 java 版翻译)
- 嵌入式linux pppoe 拨号,如何自动配置安装?
- x01.Game.LitSkull: 梯次防御
- java语法变量、继承变量和继承方法
- PAT3-04 一元多项式的乘加
- 存储器的分类
- Win8.1/Win8 系统下安装Oracle 10g 提示“程序异常终止,发生未知错误”的解决方法