1. 程式人生 > >[BZOJ1054] 移動玩具

[BZOJ1054] 移動玩具

移動 HP ont ios tro memory 表示 blank queue

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 }

[BZOJ1054] 移動玩具