题意:八数码问题,bfs+哈希
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define FP freopen("in.txt","r",stdin) 4 const int maxn=400010; 5 const int mod=1313131; 6 7 typedef int Sta[9]; 8 Sta st[maxn],goal; 9 int dis[maxn]; 10 int head[mod],nex[maxn]; 11 int dir[4][2]={0,1,0,-1,1,0,-1,0}; 12 13 void init_vis(){ 14 memset(head,-1,sizeof(head)); 15 } 16 17 int hs(Sta& s){ 18 int v=0; 19 for(int i=0;i<9;i++) v=v*10+s[i]; 20 return v%mod; 21 } 22 23 int try_vis(int s){ 24 int u=hs(st[s]); 25 for(int v=head[u];v!=-1;v=nex[v]){ 26 if(memcmp(st[s],st[v],sizeof(st[s]))==0) return 0; 27 } 28 nex[s]=head[u]; 29 head[u]=s; 30 return 1; 31 } 32 33 int bfs(){ 34 init_vis(); 35 int ff=1,ee=2; 36 dis[ff]=0; 37 while(ff<ee){ 38 Sta& s=st[ff]; 39 if(memcmp(s,goal,sizeof(s))==0) return ff; 40 int z; 41 for(z=0;z<9;z++) if(!s[z]) break; 42 int x=z/3,y=z%3; 43 for(int i=0;i<4;i++){ 44 int nx=x+dir[i][0]; 45 int ny=y+dir[i][1]; 46 int nz=nx*3+ny; 47 if(nx>=0&&nx<3&&ny>=0&&ny<3){ 48 Sta& t=st[ee]; 49 memcpy(&t,&s,sizeof(s)); 50 t[nz]=s[z]; 51 t[z]=s[nz]; 52 dis[ee]=dis[ff]+1; 53 if(try_vis(ee)) ee++; 54 } 55 } 56 ff++; 57 } 58 return 0; 59 60 } 61 int main(){ 62 //FP; 63 int T; 64 scanf("%d",&T); 65 for(int i=0;i<9;i++) goal[i]=(i+1)%9; 66 while(T--){ 67 for(int i=0;i<9;i++) scanf("%d",&st[1][i]); 68 int ans=bfs(); 69 if(ans>0) printf("%d ",dis[ans]); 70 else puts("No Solition!"); 71 } 72 }