当前位置:   article > 正文

编程题1-推箱子(字节跳动2018校招)_推箱子编程题

推箱子编程题

题目描述

有一个推箱子的游戏, 一开始的情况如下图:

上图中, '.' 表示可到达的位置, '#' 表示不可到达的位置,其中 S 表示你起始的位置, 0表示初始箱子的位置, E表示预期箱子的位置,你可以走到箱子的上下左右任意一侧, 将箱子向另一侧推动。如下图将箱子向右推动一格;
..S0.. -> ...S0.

注意不能将箱子推动到'#'上, 也不能将箱子推出边界;

现在, 给你游戏的初始样子, 你需要输出最少几步能够完成游戏, 如果不能完成, 则输出-1

输入描述

第一行为2个数字,n, m, 表示游戏盘面大小有n 行m 列(5< n, m < 50);
后面为n行字符串,每行字符串有m字符, 表示游戏盘面;

输出描述

一个数字,表示最少几步能完成游戏,如果不能,输出-1;

示例1

输入:

3 6
.S#..E
.#.0..
......

输出: 11

算法分析

典型的迷宫搜索问题,求最短时间,我们首先想到BFS。 
和典型的迷宫搜索问题不同的是,本题中的搜索可以分为两个阶段。 
第一阶段:游戏玩家从起始位置“S”走到箱子的位置(箱子的上、下、左、右)。 
第二阶段:游戏玩家把箱子从“0”位置推到“E”位置。 
在第一阶段中,和普通的BFS一样。在第二阶段中,玩家要和箱子一起移动。

提交代码:

  1. #include<iostream>
  2. #include<vector>
  3. #include<string>
  4. #include<memory.h>
  5. #include<map>
  6. #include<queue>
  7. using namespace std;
  8. struct Node {
  9. int x, y, b_x, b_y, step;
  10. Node(int x, int y, int b_x, int b_y, int step) :
  11. x(x), y(y), b_x(b_x), b_y(b_y), step(step) {};
  12. };
  13. int n, m;
  14. vector<string> path;
  15. // xy bxby 推着箱子走
  16. int visited[50][50][50][50];
  17. const vector<pair<int, int>> direc = { { 0,1 },{ 0,-1 },{ 1,0 },{ -1,0 } };
  18. bool valid(int x, int y)
  19. {
  20. if (x < 0 || x >= n || y < 0 || y >= m || path[x][y] == '#') return false;
  21. return true;
  22. }
  23. int bfs(int start_x, int start_y, int box_x, int box_y)
  24. {
  25. queue<Node> que;
  26. que.push(Node(start_x, start_y, box_x, box_y, 0));
  27. visited[start_x][start_y][box_x][box_y] = 1;
  28. while (!que.empty()) {
  29. Node node = que.front();
  30. que.pop();
  31. int bx = node.b_x;
  32. int by = node.b_y;
  33. int step = node.step;
  34. for (int i = 0; i < 4; ++i) {
  35. int x = node.x + direc[i].first;
  36. int y = node.y + direc[i].second;
  37. // 箱子被同方向推动的位置
  38. int next_x = bx + direc[i].first;
  39. int next_y = by + direc[i].second;
  40. if (!valid(x, y)) continue;
  41. // 走到箱子旁边
  42. if ((x != bx || y != by) && visited[x][y][bx][by] == 0) {
  43. visited[x][y][bx][by] = 1;
  44. que.push(Node(x, y, bx, by, step + 1));
  45. // 推箱子
  46. }
  47. else if (x == bx && y == by && valid(next_x, next_y) && visited[x][y][next_x][next_y] == 0) {
  48. visited[x][y][next_x][next_y] = 1;
  49. if (path[next_x][next_y] == 'E')
  50. return step+1;
  51. que.push(Node(x, y, next_x, next_y, step + 1));
  52. }
  53. }
  54. }
  55. return -1;
  56. }
  57. int main()
  58. {
  59. memset(visited, 0, sizeof(visited));
  60. cin >> n >> m;
  61. path = vector<string>(n, string(""));
  62. for (int i = 0; i < n; ++i) cin >> path[i];
  63. int start_x, start_y, box_x, box_y;
  64. for (int i = 0; i < n; ++i) {
  65. for (int j = 0; j < m; ++j) {
  66. if (path[i][j] == 'S') {
  67. start_x = i, start_y = j;
  68. }
  69. else if (path[i][j] == '0') {
  70. box_x = i, box_y = j;
  71. }
  72. }
  73. }
  74. cout << bfs(start_x, start_y, box_x, box_y) << endl;
  75. return 0;
  76. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/484341
推荐阅读
相关标签
  

闽ICP备14008679号