suseoj 1212: 推箱子问题(bfs)
Posted getcharzp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了suseoj 1212: 推箱子问题(bfs)相关的知识,希望对你有一定的参考价值。
1212: 推箱子问题
时间限制: 1 Sec 内存限制: 128 MB提交: 60 解决: 13
[提交][状态][讨论版][命题人:liyuansong]
题目描述
码头仓库是划分为n×m个格子的矩形阵列。有公共边的格子是相邻格子。当前仓库中有的格子是空闲的,有的格子则已经堆放了沉重的货物。由于堆放的货物很重,单凭仓库管理员的力量是无法移动的。仓库管理员有一项任务:要将一个小箱子推到指定的格子上去。管理员可以在仓库中移动,但不能跨过已经堆放了货物的格子。管理员站在与箱子相对的空闲格子上时,可以做一次推动,把箱子推到另一相邻的空闲格子。推箱时只能向管理员的对面方向推。由于要推动的箱子很重,仓库管理员想尽量减少推箱子的次数。对于给定的仓库布局,以及仓库管理员在仓库中的位置和箱子的开始位置和目标位置,设计一个解推箱子问题的分支限界法,计算出仓库管理员将箱子从开始位置推到目标位置所需的最少推动次数。
输入
第1行有2个正整数n和m(1≤n,m≤100),表示仓库是n×m个格子的矩形阵列。接下来有n行,每行有m个字符,表示格子的状态。
S——格子上放了不可移动的沉重货物;
w——格子空闲;
M——仓库管理员的初始位置;
P——箱子的初始位置;
K——箱子的目标位置。
输出
将计算出的最少推动次数输出。如果仓库管理员无法将箱子从开始位置推到目标位置则输出 “No Solution!”。
样例输入
10 12 SSSSSSSSSSSS SwwwwwwwSSSS SwSSSSwwSSSS SwSSSSwwSKSS SwSSSSwwSwSS SwwwwwPwwwww SSSSSSSwSwSw SSSSSSMwSwww SSSSSSSSSSSS SSSSSSSSSSSS
样例输出
7
这是一道简单的BFS题(????????????)
C/C++代码实现(AC):
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 }
以上是关于suseoj 1212: 推箱子问题(bfs)的主要内容,如果未能解决你的问题,请参考以下文章