八数码

经典搜索题,bfs

 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 }
八数码
posted @ 2018-07-12 06:18  昤昽  阅读(155)  评论(0编辑  收藏  举报