八数码问题
/*调用算法中函数求写一个排序*/ #include <iostream> #include<algorithm> #include<queue> #include<stack> #include<cmath> #include<string.h> #include<stdio.h> #include<stdlib.h> using namespace std; #define maxn 2600000 typedef int State[9]; State st[maxn],goal; int dist[maxn]; const int dx[]= {-1,1,0,0}; const int dy[]= {0,0,-1,1}; int vis[36288],fact[9]; /*void init_lookup_table() { int i; fact[0]=1; for(i=0;i<9;i++) fact[i]=fact[i-1]*i; } int try_to_insert(int s) { int code=0,i,j,cnt;//把st[s]映射到整数code for(i=0;i<9;i++) { cnt=0; for(j=i+1;j<9;j++) if(st[s][j]<st[s][i]) cnt++; code+=fact[8-i]*cnt; } if(vis[code]) return 0; return vis[code]=1; }*/ const int MAXHASHSIZE = 1000003; int head[MAXHASHSIZE],next[maxn]; void init_lookup_table() { memset(head,0,sizeof(head)); } int hash(State & s) { int v =0; for(int i=0; i<9; i++) v=v*10+s[i]; return v % MAXHASHSIZE; } int try_to_insert(int s) { int h=hash(st[s]); int u=head[h]; while(u) { if(memcmp(st[u],st[s],sizeof(st[s]))==0) return 0; u=next[u]; } next[s]=head[h]; head[h]=s; return 1; } int bfs() { int y,d; init_lookup_table(); int front =1,rear =2; while(front<rear) { State & s =st[front]; if(memcmp(goal,s,sizeof(s))==0) return front; int z; for(z=0; z<9; z++) if(!s[z]) break; int x =z/3; y=z%3; for(d = 0; d <4; d++) { int newx =x +dx[d]; int newy =y +dy[d]; int newz =newx*3+newy; if(newx>=0&&newx<3&&newy>=0&&newy<3) { State &t =st[rear]; memcpy(&t,&s,sizeof(s)); t[newz]=s[z]; t[z]=s[newz]; dist[rear]=dist[front]+1; if(try_to_insert(rear)) rear++; } } front++; } return 0; } int main() { int i; while(1) { for(i=0; i<9; i++) scanf("%d",&st[1][i]); for(i=0; i<9; i++) scanf("%d",&goal[i]); int ans=bfs(); if(ans>0) printf("%d\n",dist[ans]); else printf("-1\n"); } return 0; } /* 2 6 4 1 3 7 0 5 8 8 1 5 7 3 6 4 0 2 31 */