我的编程学习日志(14)--八数码问题(代码)
来源:互联网 发布:淘宝店铺首页怎么做 编辑:程序博客网 时间:2024/06/15 13:41
终于把八数码问题解决了,先贴上代码,详解下一篇博文给出
本人测试了一下,应该没有错,如果发现有错欢迎指正
(转载代码请标明出处)
#include<iostream>using namespace std;#define LL __int64#define max 362885int fact[9]={0,1,2,6,24,120,720,5040,40320};struct X{int num[9];};X begin,goal,state[max];int dx[]={1,-1,0,0};int dy[]={0,0,1,-1};int xiabiao[max],temp[max];//记录下标int thexiabiao=1;bool vis[max];int hash(X temp){int i,j,z,count,no=0;int a[9];bool f;for(i=0;i<9;i++){count=0;f=true;for(j=0;j<9;j++){for(z=0;z<=i;z++){if(a[z]==j){f=false;break;}}if(temp.num[i]>j && f==true)count++;f=true;}a[i]=temp.num[i];no+=count*fact[8-i];}return no;}bool equal(X a,X b){int i;for(i=0;i<9;i++){if(a.num[i]!=b.num[i])return false;}return true;}int front=0,rear=1;bool bfs(X first){int i,t;int z,x,y;bool f=false;for(i=0;i<9;i++){if(first.num[i]==0)break;}z=i;x=z%3;y=z/3;int newz,newx,newy;X two;for(i=0;i<4;i++){two=first;newx=x+dx[i];newy=y+dy[i];if(newx>2 || newx<0 || newy>2 || newy<0)continue;newz=newy*3+newx;two.num[newz]=first.num[z];two.num[z]=first.num[newz];t=hash(two);if(vis[t]==0){state[rear]=two;xiabiao[thexiabiao++]=front;rear++;vis[t]=1;if( equal(two,goal) ){f=true;return 1;}}}if(f==false){front++;bool ff=bfs(state[front]);if(ff==1)return 1;return 0;}}int main(){xiabiao[0]=-1;bool f;int i,j;for(i=0;i<9;i++)scanf("%d",&begin.num[i]);for(i=0;i<9;i++)scanf("%d",&goal.num[i]);vis[hash(begin)]=1;state[front]=begin;f=bfs(begin);if(f){j=xiabiao[--thexiabiao];for(i=0;j>=0;i++){//printf("j%d ",j);temp[i]=j;j=xiabiao[j];}i--;while(i>0){for(j=0;j<9;j++){printf("%d",state[temp[i]].num[j]);if((j+1)%3==0)printf("\n");}i--;printf("\n");}}elseprintf("no\n");return 0;}
0 0
- 我的编程学习日志(14)--八数码问题(代码)
- 简单的八数码问题(BFS)
- 八数码问题(暴力)
- 趣味编程:用BGL求解八数码问题(A*)
- 九宫问题(八数码问题)的解法
- 九宫问题(八数码问题)的解法
- 八数码问题C代码
- A*算法的简单实现(八数码问题)
- POJ 1077 Eight(神奇的八数码问题)
- 出了问题的代码 八数码问题
- 八数码问题(HDU 1043)
- 八数码问题(bfs+哈希)
- HDU 1043(八数码问题)
- 八数码问题 (stl bfs)
- 蓝桥杯 九宫重排(八数码问题)
- 康托展开(八数码问题)
- 八数码问题(hash+bfs)
- [题解] 八数码问题 (哈希表+搜索)
- MoiMark安卓中国终端体验性能排行榜(2014年10月)
- Log4net.config配置文件
- C++操作符的优先级
- 我的windows下的vim
- 第8周——定期存款利息计算器
- 我的编程学习日志(14)--八数码问题(代码)
- android签名机制
- JAVA基础实例(三)--排序
- 如何删除织梦Dedecms已添加的自定义字段
- 第8周项目定期存款利息计算器
- Ubuntu安装后要做的几件事
- [转载] [强烈推荐]大牛对计算机读研的看法
- sql server 远程过程调用失败 0x800706be 解决方法
- 东风风行网络