码头仓库是划分为n×m个格子的矩形阵列。有公共边的格子是相邻格子。当前仓库中有的格子是空闲的,有的格子则已经堆放了沉重的货物。由于堆放的货物很重,单凭仓库管理员的力量是无法移动的。仓库管理员有一项任务:要将一个小箱子推到指定的格子上去。管理员可以在仓库中移动,但不能跨过已经堆放了货物的格子。管理员站在与箱子相对的空闲格子上时,可以做一次推动,把箱子推到另一相邻的空闲格子。推箱时只能向管理员的对面方向推。由于要推动的箱子很重,仓库管理员想尽量减少推箱子的次数。对于给定的仓库布局,以及仓库管理员在仓库中的位置和箱子的开始位置和目标位置,设计一个解推箱子问题的分支限界法,计算出仓库管理员将箱子从开始位置推到目标位置所需的最少推动次数。
第1行有2个正整数n和m(1≤n,m≤100),表示仓库是n×m个格子的矩形阵列。接下来有n行,每行有m个字符,表示格子的状态。
S——格子上放了不可移动的沉重货物;
w——格子空闲;
M——仓库管理员的初始位置;
P——箱子的初始位置;
K——箱子的目标位置。
将计算出的最少推动次数输出。如果仓库管理员无法将箱子从开始位置推到目标位置则输出 “No Solution!”。
1 #include <iostream>
2 #include <algorithm>
3 #include <cstring>
4 #include <cstdio>
5 #include <cmath>
6 #include <stack>
7 #include <map>
8 #include <queue>
9 #include <climits>
10
11 using namespace std;
12 const int MAX = 110;
13 char my_map[MAX][MAX];
14 int n, m, my_book[MAX][MAX]= {0}, Mx, My, Px, Py, Kx, Ky, mov[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
15
16 struct node
17 {
18 int x, y, cnt;
19 };
20
21 bool judge(node q)
22 {
23 if (my_book[q.x][q.y]) return false;
24 if (my_map[q.x][q.y] == ‘S‘) return false;
25 if (q.x < 0 || q.x >= n || q.y < 0 || q.y >= m) return false;
26 return true;
27 }
28
29 int bfs1()
30 {
31 node q1, q2;
32 q1.x = Mx, q1.y = My, q1.cnt = 0;
33 my_book[Mx][My] = 1;
34 queue <node> Q;
35 Q.push(q1);
36 while(!Q.empty())
37 {
38 q1 = Q.front();
39 if(my_map[q1.x][q1.y] == ‘P‘) return q1.cnt - 1;
40 for(int i = 0; i < 4; ++ i)
41 {
42 q2 = q1;
43 q2.x = q1.x + mov[i][0];
44 q2.y = q1.y + mov[i][1];
45 q2.cnt = q1.cnt + 1;
46 if (judge(q2))
47 {
48 Q.push(q2);
49 my_book[q2.x][q2.y] = 1;
50 }
51 }
52 Q.pop();
53 }
54 return 0;
55 }
56
57 int bfs2()
58 {
59 memset(my_book, 0, sizeof(my_book));
60 node q1, q2;
61 q1.x = Px, q1.y = Py, q1.cnt = 0;
62 my_book[Mx][My] = 1;
63 queue <node> Q;
64 Q.push(q1);
65 while(!Q.empty())
66 {
67 q1 = Q.front();
68 if(my_map[q1.x][q1.y] == ‘K‘) return q1.cnt - 1;
69 for(int i = 0; i < 4; ++ i)
70 {
71 q2 = q1;
72 q2.x = q1.x + mov[i][0];
73 q2.y = q1.y + mov[i][1];
74 q2.cnt = q1.cnt + 1;
75 if (judge(q2))
76 {
77 Q.push(q2);
78 my_book[q2.x][q2.y] = 1;
79 }
80 }
81 Q.pop();
82 }
83 return 0;
84 }
85
86 int main()
87 {
88 cin >> n >>m;
89 for(int i = 0; i < n; ++ i)
90 {
91 cin >>my_map[i];
92 for(int j = 0; j < m; ++ j)
93 {
94 if (my_map[i][j] == ‘M‘)
95 {
96 Mx = i, My = j;
97 }
98 if (my_map[i][j] == ‘P‘)
99 {
100 Px = i, Py = j;
101 }
102 if (my_map[i][j] == ‘K‘)
103 {
104 Kx = i, Ky = j;
105 }
106 }
107 }
108 int t1 = bfs1();
109 if(t1 == 0)
110 {
111 cout <<"No Solution!" <<endl;
112 return 0;
113 }
114 int t2 = bfs2();
115 if (t2 == 0)
116 {
117 cout <<"No Solution!" <<endl;
118 }
119 else
120 {
121 cout <<t1 + t2 <<endl;
122 }
123 }