bzoj 1054: [HAOI2008]移动玩具

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 struct data
 5 {
 6     int a[4][4],bu;
 7 }q[100000];
 8 int h=0,t=1,f[1000000],b[4][4];
 9 char ch[8];
10 int xx[4]={0,0,1,-1},yy[4]={1,-1,0,0};
11 int hash(int b[4][4])
12 {
13     int k=1,sum=0;
14     for(int i=0;i<4;i++)
15       for(int j=0;j<4;j++)
16         {
17             sum+=b[i][j]*k;
18             k<<=1;
19         }
20     return sum;
21 }
22 int main()
23 {
24     for(int i=0;i<4;i++)
25       {
26         scanf("%s",ch);
27         for(int j=0;j<4;j++)
28           q[t].a[i][j]=ch[j]-'0';
29       }
30     for(int i=0;i<4;i++)
31       {
32         scanf("%s",ch);
33         for(int j=0;j<4;j++)
34           b[i][j]=ch[j]-'0';
35       }
36     int a1=hash(b);
37     f[hash(q[h].a)]=1;
38     for(;h<t;)
39       {
40         h++;
41         int a2=hash(q[h].a);
42         if(a2==a1)
43           break;
44         for(int i=0;i<4;i++)
45           for(int j=0;j<4;j++)
46             if(q[h].a[i][j]==0)
47               for(int k=0;k<4;k++)
48                 {
49                     int nx=i+xx[k],ny=j+yy[k];
50                     if(ny<4&&ny>=0&&nx<4&&nx>=0&&q[h].a[nx][ny])
51                       {
52                         t++;
53                         q[t]=q[h];
54                         swap(q[t].a[nx][ny],q[t].a[i][j]);
55                         if(!f[hash(q[t].a)])
56                           {
57                             f[hash(q[t].a)]=1;
58                             q[t].bu++;
59                           }
60                         else
61                           t--;
62                       }                 
63                 }
64       }
65     printf("%d
",q[h].bu);
66     return 0;
67 }
68 

这是一个搜索。。。

原文地址:https://www.cnblogs.com/xydddd/p/5232792.html