八数码
#include<cstdio> #include<string.h> #define maxn 1000000 struct node { int q[10]; int fa; int step; }s[maxn]; int data[]={1,2,3,8,0,4,7,6,5}; int h[]={1,1,2,6,24,120,720,5040,40320}; const int dx[]={-1,1,0,0}; const int dy[]={0,0,-1,1}; int vis[10000000]; int gethash(int t) { int sum=0; for(int i=0;i<9;i++) { int num=0; for(int j=i+1;j<9;j++) { if(s[t].q[j]<s[t].q[i]) num++; } sum+=num*h[8-i]; } if (!vis[sum]) return vis[sum]=1; else return 0; } int bfs() { int front=1; int rear=2; while(front<rear) { if(memcmp(data,s[front].q,sizeof(data))==0) return front; int z; for(int i=0;i<9;i++) if(s[front].q[i]==0) {z=i;break; } for(int i=0;i<4;i++) { int x=z/3; int y=z%3; int nx=x+dx[i]; int ny=y+dy[i]; int nz=nx*3+ny; if(nx>=0&&nx<3&&ny>=0&&ny<3) { memcpy(s[rear].q,s[front].q,sizeof(s[front].q)); int t=s[rear].q[nz]; s[rear].q[nz]=0; s[rear].q[z]=t; s[rear].step=s[front].step+1; if (gethash(rear)) rear++; } } front++; } return 0; } int main() { for(int i=0;i<9;i++) scanf("%01d",&s[1].q[i]); s[1].fa=0; s[1].step=0; int p=bfs(); printf("%d\n",s[p].step); return 0; }