推箱子问题求解c++
时间: 2024-05-25 19:08:29 浏览: 270
推箱子问题,也称为 Sokoban,是一个经典的益智游戏。在这个游戏中,玩家需要将箱子推到指定的位置,通过推动和移动来达到目标。在计算机科学中,推箱子问题也被用来测试搜索算法和人工智能技术。
C++ 是一种流行的编程语言,可以用来实现推箱子问题的求解算法。其中常用的算法包括深度优先搜索、广度优先搜索、A* 算法等等。
以下是一个简单的 C++ 代码示例,展示了如何实现深度优先搜索算法来解决推箱子问题。请注意,此代码并不完整,仅供参考。
```
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 20;
int n, m, sx, sy, tx, ty;
char g[N][N];
bool st[N][N][N][N];
struct Node {
int x, y, px, py;
};
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
bool dfs(int x, int y, int px, int py) {
if (g[x][y] == 'T') return true;
if (st[x][y][px][py]) return false;
st[x][y][px][py] = true;
for (int i = 0; i < 4; i++) {
int a = x + dx[i], b = y + dy[i];
if (g[a][b] == '#') continue;
if (a == px && b == py) {
int c = a + dx[i], d = b + dy[i];
if (g[c][d] == '#') continue;
g[a][b] = '.';
g[c][d] = 'O';
if (dfs(a, b, c, d)) return true;
g[a][b] = 'O';
g[c][d] = '.';
} else {
if (dfs(a, b, x, y)) return true;
}
}
return false;
}
int main() {
while (cin >> n >> m) {
memset(st, 0, sizeof st);
memset(g, '#', sizeof g);
for (int i = 1; i <= n; i++) {
getchar();
for (int j = 1; j <= m; j++) {
cin >> g[i][j];
if (g[i][j] == 'S') sx = i, sy = j;
if (g[i][j] == 'T') tx = i, ty = j;
}
}
bool success = dfs(sx, sy, -1, -1);
if (success) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
```
阅读全文
相关推荐















