九数码
来源:互联网 发布:胎儿b超数据标准 编辑:程序博客网 时间:2024/04/29 23:21
操作,对一个2*2的方格顺时针旋转问达到目标状态的最小步数,用BFS逆时针旋转。
预处理,查表。
#include<cstdio>#include<cstring>#include<string.h>#include<algorithm>#include<iostream>#include<math.h>#include<vector>using namespace std;const int MAXNODE=362880;struct State{char d[9];short f;};int power[]={1,2,6,24,120,720,5040,40320};int rot[4][9]={{1,4,2,0,3,5,6,7,8},{0,2,5,3,1,4,6,7,8},{0,1,2,4,7,5,3,6,8},{0,1,2,3,5,8,6,4,7}};short ans[MAXNODE];int head,tail;State Q[MAXNODE];int State2I(State p){int ret=0;for(int i=0;i<8;i++)for(int j=i+1;j<9;j++)if(p.d[i]>p.d[j]) ret+=power[7-i];return ret;}void PreCom(){memset(ans,255,sizeof(ans));Q[0].f=0;head=-1,tail=0;for(int i=0;i<9;i++)Q[0].d[i]=i+1;ans[State2I(Q[0])]=0;while(head++<tail){State p=Q[head],q;q.f=p.f+1;for(int i=0;i<4;i++){for(int j=0;j<9;j++)q.d[j]=p.d[rot[i][j]];int u=State2I(q);if(ans[u]<0){ans[u]=q.f;Q[++tail]=q;}}}}void Work(){State p;int x;while(scanf("%d",&x)==1){p.d[0]=x;for(int i=1;i<9;i++){scanf("%d",&x);p.d[i]=x;}printf("%d\n",ans[State2I(p)]);}}int main(){PreCom();Work();return 0;}
from sysuoj
阅读全文
0 0
- 九数码
- 九数码
- 九数码(康拓展开+BFS)
- 数码锁
- 再论八数码
- 数码印刷
- 八数码
- 八数码
- 八数码
- 八数码
- 八数码
- 八数码
- 八数码
- 数码时钟
- 数码时钟
- 八数码
- 8数码
- 六数码
- HTTPS中的对称密钥加密,公开密钥加密,数字证书
- 一般背包问题的贪心算法
- 关于拦截登录session失效,页面包含页面问题
- OpenCV配置指南
- java.util.NoSuchElementException
- 九数码
- 第一章 C++程序的基本构成
- 220.map2-百度地图api使用
- 基于Packet tracer 的计算机网络实验第三节(DNS搭建与FTP管窥)
- 打架
- Android的自动化构建(一)未完成,待续
- 素数距离问题
- 人脸数据集分享
- 解决Mac下安装nmp的淘宝镜像失败