[编程题]推箱子
来源:互联网 发布:js兼容性注释 编辑:程序博客网 时间:2024/06/09 03:22
题目来源:牛客网
[编程题] 推箱子
大家一定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地。玩家可以往上下左右4个方向移动,但是不能移动出地图或者移动到障碍里去。如果往这个方向移动推到了箱子,箱子也会按这个方向移动一格,当然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地以后,游戏目标达成。现在告诉你游戏开始是初始的地图布局,请你求出玩家最少需要移动多少步才能够将游戏目标达成。
输入描述:
每个测试输入包含1个测试用例
第一行输入两个数字N,M表示地图的大小。其中0<N,M<=8。
接下来有N行,每行包含M个字符表示该行地图。其中 .表示空地、X表示玩家、*表示箱子、#表示障碍、@表示目的地。
每个地图必定包含1个玩家、1个箱子、1个目的地。
输出描述:
输出一个数字表示玩家最少需要移动多少步才能将游戏目标达成。当无论如何达成不了的时候,输出-1。
输入例子:
4 4......*@.....X..6 6...#........#*##....##.#..X....@#...输出例子:311*/
主要方法是dfs,
本代码中移动位置时以人的位置为参考,人分别上下左右移动,判断新位置是否可达–>(如果可达)移动是否影响到箱子–>(如果影响到箱子)箱子的新位置是否可达。
也可以以箱子的位置为参考,分别上下左右移动,判断新位置是否可达–>(如果可达)反方向处人是否可达,同时记录人的移动步数。
#include <iostream>#include <queue>using namespace std;struct pt{ int x; int y;};struct pos{ pt ppos; pt bpos;};bool map[8][8];int status[8][8][8][8];pt dst, person, box;int minlength;void dfs(int row, int col){ for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) for (int m = 0; m < 8; m++) for (int n = 0; n < 8; n++) { status[i][j][m][n] = -1; } status[person.x][person.y][box.x][box.y] = 0; queue<pos>slist; pos start = { person, box }; slist.push(start); while (!slist.empty()) { pos cur = slist.front(); slist.pop(); int px = cur.ppos.x; int py = cur.ppos.y; int bx = cur.bpos.x; int by = cur.bpos.y; int len = status[px][py][bx][by]; if (bx == dst.x && by == dst.y) { minlength = len; return; } else { //上 if ((px - 1) >= 0 && map[px - 1][py]) { pt ppos = { px - 1, py }; if ((px - 1) == bx && py == by) { if ((bx - 1) >= 0 && map[bx - 1][by] && status[px - 1][py][bx - 1][by] == -1) { status[px - 1][py][bx - 1][by] = len + 1; pt bpos = { bx - 1, by }; pos newpos = { ppos, bpos }; slist.push(newpos); } } else if (status[px - 1][py][bx][by] == -1) { status[px - 1][py][bx][by] = len + 1; pos newpos = { ppos, cur.bpos }; slist.push(newpos); } } //下 if ((px + 1) < row && map[px + 1][py]) { pt ppos = { px + 1, py }; if ((px + 1) == bx && py == by) { if ((bx + 1) < row && map[bx + 1][by] && status[px + 1][py][bx + 1][by] == -1) { status[px + 1][py][bx + 1][by] = len + 1; pt bpos = { bx + 1, by }; pos newpos = { ppos, bpos }; slist.push(newpos); } } else if (status[px + 1][py][bx][by] == -1) { status[px + 1][py][bx][by] = len + 1; pos newpos = { ppos, cur.bpos }; slist.push(newpos); } } //左 if ((py - 1) >= 0 && map[px][py - 1]) { pt ppos = { px, py - 1 }; if (px == bx && (py - 1) == by) { if ((by - 1) >= 0 && map[bx][by - 1] && status[px][py - 1][bx][by - 1] == -1) { status[px][py - 1][bx][by - 1] = len + 1; pt bpos = { bx, by - 1 }; pos newpos = { ppos, bpos }; slist.push(newpos); } } else if (status[px][py - 1][bx][by] == -1) { status[px][py - 1][bx][by] = len + 1; pos newpos = { ppos, cur.bpos }; slist.push(newpos); } } //右 if ((py + 1) < col && map[px][py + 1]) { pt ppos = { px, py + 1 }; if (px == bx && (py + 1) == by) { if ((by + 1) < col && map[bx][by + 1] && status[px][py + 1][bx][by + 1] == -1) { status[px][py + 1][bx][by + 1] = len + 1; pt bpos = { bx, by + 1 }; pos newpos = { ppos, bpos }; slist.push(newpos); } } else if (status[px][py + 1][bx][by] == -1) { status[px][py + 1][bx][by] = len + 1; pos newpos = { ppos, cur.bpos }; slist.push(newpos); } } } } minlength = -1;}int main(void){ int row, col; cin >> row >> col; for (int i = 0; i < row; i++) for (int j = 0; j < col; j++) { char a; cin >> a; do { cin >> a; } while (a == ' '); switch (a) { case '.':map[i][j] = true; break; case 'X': map[i][j] = true; person.x = i; person.y = j; break; case '*': map[i][j] = true; box.x = i; box.y = j; break; case '#': map[i][j] = false; break; case '@': map[i][j] = true; dst.x = i; dst.y = j; break; } } //输入完毕,开始搜索 dfs(row, col); cout << minlength; cin.get(); cin.get(); return 0;}
0 1
- [编程题]推箱子
- [编程题] 推箱子
- [编程题] 推箱子
- [编程题] 推箱子
- 编程题——推箱子
- 算法题--推箱子
- 网易笔试题 推箱子
- win32GDI函数编程实现推箱子小游戏
- win32GDI位图编程实现推箱子小游戏
- 编程笔试——推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- JAVA 是参数传递 不是引用传递 例子
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
- MaxComputeSql性能调优
- 未来十二个趋势
- Mybatis的ResultMap的使用
- [编程题]推箱子
- 通过代码实现EXE文件图标的替换
- centos6.5 yum安装redis
- .NET Core配置文件加载与DI注入配置数据
- Logstash + DataHub + MaxCompute/StreamCompute 进行实时数据分析
- 反省
- popupwindow控制点击空白处是否隐藏
- unity 插件curvy做出来的效果以及 curvy的部分BUG(也算不上BUG吧)
- SQLite简单使用 总结