推箱子bfs c++
时间: 2024-01-31 17:10:28 浏览: 82
以下是使用BFS算法实现推箱子游戏的C++代码示例:
```cpp
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct State {
int bx, by; // 箱子的位置
int px, py; // 人的位置
int steps; // 步数
};
int main() {
int n, m; // 地图的行数和列数
cin >> n >> m;
vector<vector<char>> map(n, vector<char>(m)); // 地图
vector<vector<vector<vector<bool>>>> visited(n, vector<vector<vector<bool>>>(m, vector<vector<bool>>(n, vector<bool>(m, false)))); // 记录访问状态
int bx, by, px, py, tx, ty; // 箱子、人和目标位置的坐标
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> map[i][j];
if (map[i][j] == 'B') {
bx = i;
by = j;
} else if (map[i][j] == 'S') {
px = i;
py = j;
} else if (map[i][j] == 'T') {
tx = i;
ty = j;
}
}
}
queue<State> q;
q.push({bx, by, px, py, 0});
visited[bx][by][px][py] = true;
int dx[] = {-1, 1, 0, 0}; // 上下左右四个方向的偏移量
int dy[] = {0, 0, -1, 1};
while (!q.empty()) {
State curr = q.front();
q.pop();
if (curr.bx == tx && curr.by == ty) {
cout << curr.steps << endl; // 输出最少步数
return 0;
}
for (int i = 0; i < 4; i++) {
int nx = curr.bx + dx[i];
int ny = curr.by + dy[i];
int px = curr.bx - dx[i];
int py = curr.by - dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && px >= 0 && px < n && py >= 0 && py < m && map[nx][ny] != '#' && map[px][py] != '#' && !visited[nx][ny][curr.bx][curr.by]) {
q.push({nx, ny, curr.bx, curr.by, curr.steps + 1});
visited[nx][ny][curr.bx][curr.by] = true;
}
}
}
cout << -1 << endl; // 无法到达目标位置
return 0;
}
```
阅读全文