P1379 八数码难题
1 #include<iostream> 2 #include<bits/stdc++.h> 3 using namespace std; 4 #include<vector> 5 using std::vector; 6 bool t[1000000000]; 7 int a[4][4]; 8 int ans=100000000; 9 int tx[5]={0,0,1,-1,0}; 10 int ty[5]={0,-1,0,0,1}; 11 int pc[363000]; 12 int zt=0; 13 int erfen(int a) 14 { 15 int ans=-1; 16 int l=1,r=zt,mid=(l+r)/2; 17 while(l<=r) 18 { 19 if(pc[mid]>a) 20 { 21 r=mid-1; 22 mid=(l+r)/2; 23 } 24 if(pc[mid]<a) 25 { 26 l=mid+1; 27 mid=(l+r)/2; 28 } 29 if(pc[mid]==a) 30 { 31 ans=mid; 32 return ans; 33 } 34 } 35 return ans; 36 } 37 void bfs(int x,int y,int a[4][4],int sum) 38 { 39 40 if(erfen(a[1][1]*100000000+a[1][2]*10000000+a[1][3]*1000000 41 +a[2][1]*100000+a[2][2]*10000+a[2][3]*1000+a[3][1]*100+a[3][2]*10 42 +a[3][3])!=-1) return ;//如果重复了,直接退出(删除节点) 43 if(a[1][1]*100000000+a[1][2]*10000000+a[1][3]*1000000 44 +a[2][1]*100000+a[2][2]*10000+a[2][3]*1000+a[3][1]*100+a[3][2]*10 45 +a[3][3]==123804765) 46 { 47 if(sum<ans) ans=sum; 48 cout<<"youyigejie"<<endl; 49 return ; 50 } //判断是否目标状态 51 sum++; 52 pc[++zt]=a[1][1]*100000000+a[1][2]*10000000+a[1][3]*1000000 53 +a[2][1]*100000+a[2][2]*10000+a[2][3]*1000+a[3][1]*100+a[3][2]*10 54 +a[3][3]; 55 sort(pc,pc+1+zt); 56 for(int i=1;i<=4;i++) 57 if(tx[i]+x>=1&&tx[i]+x<=3&&ty[i]+y>=1&&ty[i]+y<=3) 58 { 59 int t[4][4]; 60 for(int i=0;i<=3;i++) 61 for(int j=0;j<=3;j++) 62 t[i][j]=a[i][j]; 63 t[x][y]=t[tx[i]+x][ty[i]+y],t[tx[i]+x][ty[i]+y]=0; 64 if(erfen(t[1][1]*100000000+t[1][2]*10000000+t[1][3]*1000000 65 +t[2][1]*100000+t[2][2]*10000+t[2][3]*1000+t[3][1]*100+t[3][2]*10 66 +t[3][3])==-1)bfs(x+tx[i],y+ty[i],t,sum); 67 68 } 69 } 70 int main() 71 { 72 73 int x,y; 74 for(int i=1;i<=3;i++) 75 for(int j=1;j<=3;j++) 76 { 77 cin>>a[i][j]; 78 if(a[i][j]==0) x=i,y=j; 79 } 80 bfs(x,y,a,0); 81 cout<<ans<<endl; 82 return 0; 83 }