九宫重排
来源:互联网 发布:井下作业实用数据手册 编辑:程序博客网 时间:2024/04/27 13:55
蓝桥杯的一道题。原题链接
我用了全排列的编码优化。
AC代码
#include<cstdio>#include<cstring>const int maxn=400000;const int dx[]={-1,1,0,0};const int dy[]={0,0,-1,1};typedef int state[9];int goal[9];int res[maxn][9]; //存储访问过的节点 int d[maxn],fact[9];int vis[maxn];void init(){ fact[0]=1; for(int i=1;i<9;++i) fact[i]=i*fact[i-1];}int KT_solve(int row) //编码函数 { int code=0; for(int i=0;i<9;++i) { int cnt=0; for(int j=i+1;j<9;++j) { if(res[row][j]<res[row][i]) ++cnt; } code+=cnt*fact[8-i]; } if(vis[code]) return 0; return vis[code]=1;}int bfs(){ init(); int front=1,real=2; while(front<real) { state &s=res[front]; //用"引用"简化代码 if(memcmp(goal,s,sizeof(s))==0) return front; int pos; for(pos=0;pos<9;++pos) if(!s[pos]) break; int x=pos/3,y=pos%3; for(int i=0;i<4;++i) { int newx=x+dx[i],newy=y+dy[i]; int new_pos=newx*3+newy; if(newx>=0&&newy<3&&newy>=0&&newy<3) { state &t=res[real]; //向状态数组加入新的状态 memcpy(&t,&s,sizeof(s)); t[pos]=s[new_pos]; t[new_pos]=s[pos]; d[real]=d[front]+1; if(KT_solve(real)) real++; } } front++; } return 0;}int main(){ memset(vis,0,sizeof(vis)); d[1]=0; char s[10]; scanf("%s",s); for(int j=0;j<9;++j) { if(s[j]=='.') res[1][j]=0; else res[1][j]=s[j]-'0'; } scanf("%s",s); for(int j=0;j<9;++j) { if(s[j]=='.') goal[j]=0; else goal[j]=s[j]-'0'; } int ans=bfs(); if(ans>0) printf("%d\n",d[ans]); else printf("-1\n"); return 0;}
如有不当之处欢迎指出!
0 0
- 九宫重排
- 九宫重排
- 九宫重排
- 九宫重排
- 九宫重排
- 九宫重排
- 九宫重排
- 蓝桥杯- 九宫重排
- 蓝桥杯 九宫重排
- 九宫重排—题解
- 历届试题 九宫重排
- 九宫重排---bfs
- 蓝桥杯 九宫重排
- 蓝桥杯 九宫重排
- 蓝桥杯 九宫重排
- 九宫重排java
- 九宫重排问题
- 【BFS瞎搜】九宫重排
- html css中display与visibility的区别
- [转载]kindle屏幕出现小黑点,怎么办?
- Android触摸事件源码分析:Activity->ViewGroup->View
- oracle的查询数据表(四)
- hdu2054 A == B ? (大数)
- 九宫重排
- [HihoCoder]#1360 : 凸多边形
- SPOJ REPEATSRepeats
- jQuery内容、可见性过滤选择器
- quartz集群分布式(并发)部署解决方案-Spring
- Struts1和struts2的区别
- 华为OJ——iNOC产品部-杨辉三角的变形
- 了解数据库和mysql的简单使用
- HTML基础之标签篇(一)