八数码 bfs,哈希
来源:互联网 发布:通信与信息系统知乎 编辑:程序博客网 时间:2024/06/04 18:53
很经典的搜索,bfs部分没什么好讲的,不是很难,值得注意的是如何判定走的路径是否重复,本题采用的是哈希来判重
#include<stdio.h>#include<string.h>#include<stdlib.h>typedef int state[9];const int maxn=1000003;int head[maxn],next[maxn];//head数组表示每个hash值的头指针,next数组表示每个hash值的尾指针state st[maxn],goal;int dist[maxn];int dx[4]={-1,1,0,0};int dy[4]={0,0,-1,1};void init_lookup_table()//初始化查找表{ memset(head,0,sizeof(head));}int hash(state& s)//hash函数{ int v=0; for(int i=0;i<9;i++) v=v*10+s[i];//将9个数转化为一个9位数 return v%maxn;}int 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 0;//找到了,插入失败 u=next[u];//顺着链表继续找 } next[s]=head[h]; head[h]=s;//插入到链表中 return 1;}int bfs(){ init_lookup_table(); int front=1,rear=2; while(front<rear) { state& s=st[front]; if(memcmp(goal,s,sizeof(s))==0) return front; int z; for(z=0;z<9;z++) if(!s[z]) break; int x=z/3,y=z%3; for(int d=0;d<4;d++) { int newx=x+dx[d]; int newy=y+dy[d]; int newz=newx*3+newy; if(newx>=0&&newx<3&&newy>=0&&newy<3) { state& t=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=bfs(); if(ans>0) printf("%d\n",dist[ans]); else printf("-1\n"); return 0;}
0 0
- 八数码 bfs,哈希
- 八数码问题(bfs+哈希)
- 八数码(BFS)
- 八数码问题 bfs
- 八数码 BFS+HASH
- 八数码问题 BFS
- 八数码问题 bfs+map
- 八数码问题 BFS+hash
- 八数码问题 【隐式图bfs】
- 八数码破解(bfs+hash)
- POJ 1077 Eight(BFS八数码问题)
- 八数码问题,bfs,hash,康托
- 八数码问题(A*&&双向BFS)
- 八数码问题 经典搜索 bfs
- POJ1077八数码问题哈希,bfs
- python 处理八数码 双向BFS 拼图游戏
- 八数码问题 bfs 算法入门经典
- POJ 1077 Eight 八数码问题 BFS
- 初识单例模式(java学习笔记)
- toString的用法
- 协议集每一个子协议的实现都要分别建立一个同步块(synchronize)
- Java Applet之间的互相调用
- CENTOS针对POSTGRES出现的POSTGRESQL IDENT AUTHENTICATION FAILED FOR USER
- 八数码 bfs,哈希
- 【HNOI2008】玩具装箱
- 计算机网络 —> 数据链路层
- javaScript--快速排序实现(不用sort)
- jsoncpp的入门学习
- 通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小
- 腾讯的2014年校招的软开笔试题。
- 最后一次
- VC 获取物理网卡的MAC地址