八数码问题 bfs
2016-06-07 19:22
330 查看
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=1000000; const int hashsize=100003; int head[maxn],Next[maxn]; typedef int State[9]; State st[maxn],goal; int dist[maxn]; int dx[4]={0,0,1,-1}; int dy[4]={-1,1,0,0}; void intial() {memset(head,0,sizeof(head));} int Hash(State &s) { int v=0; for(int i=0;i<9;i++) v=v*10+s[i]; return v%hashsize; } bool try_to_insert(int s) { int h=Hash(st[s]); int u=head[h]; while(u) { if(memcmp(st[u],st[s],sizeof(st[s]))==0) return false; u=Next[u]; } Next[s]=head[h]; head[h]=s; return true; } int bfs() { intial(); int front=1,rear=2;//用front和rear来做队列 while(front<rear) { State &s=st[front]; if(memcmp(&s,&goal,sizeof(s))==0) return front; int z; for(z=0;z<9&&s[z]!=0;z++); int zx=z/3; int zy=z%3; for(int i=0;i<4;i++) { int newx=zx+dx[i]; int newy=zy+dy[i]; int newz=newx*3+newy; if(newx>=0&&newx<3&&newy>=0&&newy<3) { State &t=st[rear];//这条语句作用,当t改变时st[rear]也一起改变,导致最后st[rear]里面存了第二步的八数码状态。 memcpy(&t,&s,sizeof(s)); t[newz]=s[z]; t[z]=s[newz]; dist[rear]=dist[front]+1; if(try_to_insert(rear)) rear++; } } front++; } return 0; } int main() { for(int i=0;i<9;i++) scanf("%d",&st[1][i]); for(int i=0;i<9;i++) scanf("%d",&goal[i]); int ans=0; ans=bfs(); if(ans>0) printf("%d\n",dist[ans]); else printf("-1\n"); return 0; }STL的查重方法
set<int> vis; void intial() {vis.clear();} bool try_to_insert(int s) { int v=0; for(int i=0;i<9;i++) v=v*10+st[s][i]; if(vis.count()) return false; vis.insert(v); return true; }
相关文章推荐
- fedora samba|qemu iptables 设置
- Android 基于Message的进程间通信 Messenger完全解析
- 视频框架 Vitamio 使用教程+部分心得 (二)第一个视频demo
- Spring JDBC 的使用
- LeetCode 274: H-Index
- 常用正则表达式总结
- JAVA分数运算
- HTTP消息中header头部信息的讲解
- 第15周阅读程序(5)
- Android 热补丁动态修复框架小结
- 创建数据库,数据库内部增删改查语句
- linux下统计程序编译时间
- 队列的数组实现与链表实现
- 一切皆是对象
- android 蓝牙模块学习
- 飛飛(六十)交通工具 虚函数的应用
- 关于tomcat作为服务器 URL访问的一些问题
- android ImageLoader 混淆加载drawable出现黑色图片的解决方案
- 第15周阅读程序(4)
- jQuery实现楼梯