八数码问题

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<set>
 4 #include<time.h>
 5 using namespace std;
 6 
 7 typedef int state[9];
 8 const int max=1000000;
 9 state st[max],goal;
10 int dist[max];
11 const int dx[]={-1,1,0,0};
12 const int dy[]={0,0,-1,1};
13 
14 struct cmp
15 {
16     bool operator ()(int a,int b)const
17     {
18         return memcmp(&st[a],&st[b],sizeof(st[b]))<0;
19     }
20 };
21 
22 set<int, cmp> vis;
23 
24 void in()
25 {
26     vis.clear();
27 }
28 
29 int insert(int s)
30 {
31     if(vis.count(s)) return 0;
32     vis.insert(s);
33     return 1;
34 }
35 
36 int bfs()
37 {
38     int front,rear,z,d,newy,newz,newx,x,y;
39     rear=2;
40     front=1;
41     //state s,t;
42     in();
43     while(front<rear)
44     {
45         state &s=st[front];
46         if(memcmp(goal,s,sizeof(s))==0) return front;
47         for(z=0;z<9;z++) if(!s[z]) break;
48         x=z/3;y=z%3;
49         for(d=0;d<4;d++)
50         {
51              newx=x+dx[d];
52              newy=y+dy[d];
53              newz=newx*3+newy;
54              if(newx>=0&&newx<3&&newy>=0&&newy<3)
55              {
56                 state &t=st[rear];
57                  memcpy(&t,&s,sizeof(s));
58                  t[newz]=s[z];
59                  t[z]=s[newz];
60                  dist[rear]=dist[front]+1;
61                  if(insert(rear)) rear++;
62              }
63         }
64         front++;
65     }
66     return 0;
67 }
68         
69 int main()
70 {
71     int i,ans;
72     for(i=0;i<9;i++) scanf("%d",&st[1][i]);
73     for(i=0;i<9;i++) scanf("%d",&goal[i]);
74     ans=bfs();
75     if(ans>0) printf("%d\n",dist[ans]);
76     else printf("-1\n");
77     printf("%d\n",clock()/CLOCKS_PER_SEC);
78     return 0;
79 }

 

posted @ 2013-04-24 21:43  萧凡客  阅读(197)  评论(0编辑  收藏  举报