hdu1043八数码问题——境界三
2013-07-18 20:53
323 查看
从终态预处理每一步的结果,注意方向逆向
#include<stdio.h> #include<string.h> #include<string> #include<algorithm> #include<iostream> #include<set> #include<map> #include<queue> #include<stack> #include<vector> #include<math.h> #include<stdlib.h> #define M 400000 using namespace std; struct stu { char s[20]; int pos; }st,ed,dl[M]; struct pa { int fa; char c; }path[M]; int mark[M]; int jc[12]; int h[4]={-1,0,1,0}; int z[4]={0,1,0,-1}; char fa[]={"dlur"}; void getjc()//阶乘 { int i,j,k; jc[0]=1; for(i=1;i<12;i++) jc[i]=jc[i-1]*i; } int getkt(char s[20])//康托展开 { int i,j,k,len,an[20],ans=0; len=strlen(s); memset(an,0,sizeof(an)); for(i=0;i<len;i++)//获得当前未出现的比他小的数,即它右边有几个比他小的数 for(j=0;j<i;j++) { if(s[j]>s[i]) an[j]++; } for(i=0;i<len;i++)//康托公式运算 { ans+=an[i]*jc[len-i-1]; } return ans; } int judge(int x,int y) { return (x>=0&&x<3&&y>=0&&y<3); } void bfs() { int i,j,k,r,f,x,y,t; char c; memset(mark,0,sizeof(mark)); strcpy(ed.s,"123456780"); ed.pos=8; r=f=0; dl[0]=ed; k=getkt(ed.s); mark[k]=1; path[k].fa=k; while(r<=f) { k=getkt(dl[r].s); for(i=0;i<4;i++) { stu nw; strcpy(nw.s,dl[r].s); int p=dl[r].pos; x=p/3; y=p%3; x=x+h[i]; y=y+z[i]; if(judge(x,y)) { t=x*3+y; c=nw.s[p]; nw.s[p]=nw.s[t]; nw.s[t]=c; nw.pos=t; t=getkt(nw.s); if(mark[t]==0) { dl[++f]=nw; path[t].fa=k; path[t].c=fa[i]; mark[t]=1; } } } r++; } } int main() { int i,j,k; char c,s[100]; getjc(); bfs(); while(gets(s)) { k=strlen(s); for(i=0,j=0;i<9&&j<k;j++) { c=s[j]; if(c == 'x') { st.s[i]='0'; st.pos=i; i++; } else if(c>='0'&&c<='9') { st.s[i] = c; i++; } else continue; } st.s[9]='\0'; st.pos=getkt(st.s); int ans=st.pos; if(mark[ans]==0) { puts("unsolvable"); } else { while(ans!=path[ans].fa) { printf("%c",path[ans].c); ans=path[ans].fa; } puts(""); } } return 0; }
相关文章推荐
- hdu1043八数码问题解题报告
- hdu4021——N数码问题及其扩展
- HDU 1043 八数码问题的多种解法
- hdu(4021)八数码的解是否存在问题
- 八数码问题(HDU 1043)
- HDU 1043 Eight 八数码问题 A*搜索 启发式算法
- hdu 1043-Eight(经典八数码问题)(单向广搜 A* 状态压缩)
- [算法入门经典] 7.5.3 八数码问题 | HDU 1043
- HDU 3600 Simple Puzzle 归并排序 N*N数码问题
- HDU 1043 八数码问题 A*搜索
- HDU 1043 Eight(经典八数码问题)对比POJ 1077
- Hdu1043 Eight 【A*搜索】八数码问题
- HDU 1043 Eight(八数码第三境界|广搜+哈希+打表)
- HDU 1043 Eight(八数码第七境界|A*+哈希+曼哈顿距离)
- hdu 6048 Puzzle 思维(8数码问题
- HDU:1043 八数码问题
- HDU(3567):八数码问题(升级版)——双BFS
- hdu1043 八数码问题
- POJ1077&HDU1043 Eight 八数码第八境界 IDA* hash 康托展开 奇偶剪枝
- hdu1043八数码 bfs 打表/双向bfs/A*+康托判重+逆序奇偶剪枝