[BZOJ1054] 移动玩具

1054: [HAOI2008]移动玩具

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2741  Solved: 1537
[Submit][Status][Discuss]

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

HINT

Source


 

 

提交地址BZOJ1054

 


 

 

题解 :

调了很久, 我还是太菜了;

就是广搜,没什么难度;

一个数组写错了调了半天QAQ;

 


 

 

Code:

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue> 
 4 #include <cstring>
 5 using namespace std;
 6 
 7 int dx[]={0, 1, 0, -1, 0}, dy[]={0, 0, 1, 0, -1};
 8 bool a[5][5], b[5][5];
 9 
10 inline int Hash(bool t[5][5])
11 {
12     int k = 1, s = 0;
13     for (register int i = 1 ; i <= 4 ; i ++)
14     {
15         for (register int j = 1 ; j <= 4 ;j ++)
16         {
17             s += k * t[i][j];k <<= 1;
18         }
19     }
20     return s;
21 }
22 
23 bool vis[100010];
24 
25 struct date
26 {
27     bool o[5][5];
28     int stp;
29 }q[100010];
30 
31 int main()
32 {
33     for (register int i = 1 ; i <= 4 ; i ++)
34         for (register int j = 1 ; j <= 4 ; j ++)
35             scanf("%1d", &a[i][j]), q[0].o[i][j] = a[i][j];
36     for (register int i = 1 ; i <= 4 ; i ++)
37         for (register int j = 1 ; j <= 4 ; j ++)
38             scanf("%1d", &b[i][j]);
39     
40     int beg = Hash(a), end = Hash(b);
41     if (beg == end) {puts("0");return 0;}
42     vis[beg] = 1;    
43     int l = 0, r = 1;
44     while (l < r)
45     {
46         for (register int i = 1 ; i <= 4 ; i ++)
47         {
48             for (register int j = 1 ; j <= 4 ; j ++)
49             {
50                 if (!q[l].o[i][j]) continue;
51                 for (register int k = 1 ; k <= 4 ; k ++)
52                 {
53                     int x = i + dx[k], y = j + dy[k];
54                     if (q[l].o[x][y]) continue;
55                     if (x <= 0 or y <= 0 or x > 4 or y > 4) continue;
56                     swap(q[l].o[i][j], q[l].o[x][y]);
57                     int H = Hash(q[l].o);
58                     if (!vis[H])
59                     {
60                         if (H == end) {printf("%d\n", q[l].stp +1);return 0;}
61                         vis[H] = 1;
62                         memcpy(q[r].o, q[l].o, sizeof q[r].o);
63                         q[r].stp = q[l].stp + 1;
64                         r++;
65                     }
66                     swap(q[l].o[i][j], q[l].o[x][y]);
67                 }
68             }
69         }
70         l++;
71     }
72     return 0;
73 }

 

 

 

 

posted @ 2018-06-07 23:10  zZhBr  阅读(298)  评论(0编辑  收藏  举报