1054: [HAOI2008]移动玩具
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 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
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 ", 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 }