八数码
经典搜索题,bfs
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <queue> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 using namespace std; 6 const int fact[9]={1,1,2,6,24,120,720,5040,40320}; 7 const int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1}; 8 bool vis[40320*9]; 9 struct Matrix{ 10 int v[9],dist; 11 Matrix(){ 12 for(int i=0;i<9;i++)v[i]=i; 13 } 14 int& operator [] (int x) 15 { 16 return v[x]; 17 } 18 bool operator == (const Matrix& x) 19 const{ 20 for(int i=0;i<9;i++)if(v[i] != x.v[i])return false; 21 return true; 22 } 23 }; 24 int code(int v[]) 25 { 26 int c=0; 27 for(int i=0;i<9;i++) 28 { 29 int cnt=0; 30 for(int j=i+1;j<9;j++)if(v[i]>v[j])cnt++; 31 c+=cnt*fact[8-i]; 32 } 33 return c; 34 } 35 queue<Matrix>Q; 36 37 int bfs(Matrix begin,Matrix end) 38 { 39 begin.dist=0; 40 Q.push(begin); 41 while(!Q.empty()) 42 { 43 Matrix u=Q.front();Q.pop(); 44 if(u==end)return u.dist; 45 int z; 46 for(z=0;z<9;z++)if(!u[z])break; 47 for(int i=0;i<4;i++) 48 { 49 int a=z/3+dx[i],b=z%3+dy[i]; 50 if(a<0||a>2||b<0||b>2)continue; 51 Matrix node=u; 52 swap(node.v[a*3+b],node.v[z]); 53 int c=code(node.v); 54 if(!vis[c]) 55 { 56 vis[c]=true; 57 node.dist++; 58 Q.push(node); 59 } 60 } 61 } 62 } 63 inline int read1() 64 { 65 int x=0;char c=getchar(); 66 while(c<'0'||c>'9')c=getchar(); 67 if(c>='0'&&c<='9')x=c-'0'; 68 return x; 69 } 70 int main() 71 { 72 Matrix begin,end; 73 for(int i=0;i<9;i++)begin[i]=read1(); 74 end[0]=1;end[1]=2;end[2]=3; 75 end[3]=8;end[4]=0;end[5]=4; 76 end[6]=7;end[7]=6;end[8]=5; 77 int ans=bfs(begin,end); 78 cout<<ans; 79 return 0; 80 }