1054. [HAOI2008]移动玩具【BFS】

Description

  在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动
时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移
动到某人心中的目标状态。

Input

  前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。接着是一个空
行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。

Output

  一个整数,所需要的最少移动次数。

Sample Input

1111
0000
1110
0010

1010
0101
1010
0101

Sample Output

4

搜索,求最优的就用BFS,记得判重复状态就好

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 using namespace std;
 6 char a[6][6],b[6][6];
 7 struct node{
 8     char a[6][6];
 9 }A,B,T,q[1000001];
10 int Ans[1000001],dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};
11 bool f[1000001];
12 int judge(node A)
13 {
14     int ans=0,base=1;;
15     for (int i=1;i<=4;++i)
16         for (int j=1;j<=4;++j)
17             ans+=base*(A.a[i][j]-48),base*=2;
18     return ans;
19             
20 }
21 int main()
22 {
23     char ch[10];
24     memset(A.a,-1,sizeof(a));
25     memset(B.a,-1,sizeof(b));
26     for (int i=1;i<=4;++i)
27     {
28         scanf("%s",ch);
29         for (int j=1;j<=4;++j)
30             A.a[i][j]=ch[j-1];
31     }
32     for (int i=1;i<=4;++i)
33     {
34         scanf("%s",ch);
35         for (int j=1;j<=4;++j)
36             B.a[i][j]=ch[j-1];
37     }
38     int head=0;
39     int tail=1;
40     q[1]=A;
41     f[judge(A)]=true;
42     if (judge(A)==judge(B))
43     {
44         printf("0");
45         return 0;
46     }
47     do
48     {
49         ++head;
50         node T=q[head];
51         for (int i=1;i<=4;++i)
52             for (int j=1;j<=4;++j)
53                 if (T.a[i][j]=='1')
54                     for (int k=1;k<=4;++k)
55                         if (T.a[i+dx[k]][j+dy[k]]=='0')
56                         {
57                             swap(T.a[i][j],T.a[i+dx[k]][j+dy[k]]);
58                             int x=judge(T);
59                             if (!f[x])
60                             {                                    
61                                 ++tail;
62                                 q[tail]=T;
63                                 f[x]=true;
64                                 Ans[tail]=Ans[head]+1;
65                                 if (x==judge(B))
66                                 {
67                                     printf("%d",Ans[tail]);
68                                     return 0;
69                                 }                            
70                             }
71                             swap(T.a[i][j],T.a[i+dx[k]][j+dy[k]]);
72                         }
73     }while (head<tail);
74 }

 

posted @ 2018-03-30 20:52  Refun  阅读(184)  评论(0编辑  收藏  举报