博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
紫书p199 八数码(BFS,hash)
阅读量:5738 次
发布时间:2019-06-18

本文共 1775 字,大约阅读时间需要 5 分钟。

八数码问题  紫书上的简单搜索  渣渣好久才弄懂

#include
#include
using namespace std;const int M = 1000003;int x[4] = { -1, 1, 0, 0}, y[4] = {0, 0, -1, 1};int dis[M], h[M], s[M][9], e[9];int aton(int a[]){ int t = 0; for(int i = 0; i < 9; ++i) t = t * 10 + a[i]; return t;}int search_hash(int a[]){ int t = aton(a), p = t % M; while(h[p]) { if(h[p] == t) return p; ++p; if(p >= M) p = 0; } return p;}int bfs(){ memset(h, 0, sizeof(h)); int fro = 1, rear = 2, r, c, k = 0, p; int t[9], tmp, cur, nr, nc, nk; while(fro < rear) { memcpy(t, s[fro], sizeof(t)); cur = search_hash(t); if(memcmp(t, e, sizeof(t)) == 0) return dis[cur]; for(k = 0; t[k];) ++k; r = k / 3, c = k % 3; for(int i = 0; i < 4; ++i) { memcpy(t, s[fro], sizeof(t)); nr = r + x[i], nc = c + y[i], nk = nr * 3 + nc; if(nr < 0 || nr > 2 || nc < 0 || nc > 2) continue; tmp = t[nk]; t[nk] = 0; t[k] = tmp; p = search_hash(t); if(h[p] == 0) { h[p] = aton(t); dis[p] = dis[cur] + 1; memcpy(s[rear], t, sizeof(t)); ++rear; } } ++fro; } return -1;}int main(){ while(~scanf("%d", &s[1][0])) { memset(dis, 0, sizeof(dis)); for(int i = 1; i < 9; ++i) scanf("%d", &s[1][i]); for(int i = 0; i < 9; ++i) scanf("%d", &e[i]); h[aton(s[1]) % M] = aton(s[1]); int ans = bfs(); if(ans != -1) printf("%d\n", ans); else printf("No solution\n"); } return 0;}/*2 6 4 1 3 7 0 5 88 1 5 7 3 6 4 0 22 3 4 1 5 0 7 6 81 2 3 4 5 6 7 8 0*/

转载地址:http://aryzx.baihongyu.com/

你可能感兴趣的文章
前端安全系列(一):如何防止XSS攻击?
查看>>
IK分词器安装
查看>>
查看Linux并发连接数
查看>>
你是谁不重要,关键是你跟谁!
查看>>
CSS中规则@media的用法
查看>>
pychecker:分析你的python代码
查看>>
css 默认不显示 之后显示
查看>>
我的友情链接
查看>>
DNS显性+隐性URL转发原理
查看>>
我的友情链接
查看>>
网易有道 IP地址、手机号码归属地和身份证 查询接口API
查看>>
鼠标停留在GridView某一行时行的颜色改变
查看>>
系列3:WAS Liberty Profile hello mysql jdbc
查看>>
基础知识:python模块的导入
查看>>
Android MVC之我的实现
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
关于批处理-1
查看>>
Tomcat部署Web应用方法总结
查看>>
Python3 django2.0 字段加密 解密 AES
查看>>