当前位置:   article > 正文

c++迷宫游戏 & 迷宫最短路问题(DFS实例 & BFS实例)_c++t396758 [glfls 7d] 小熊走迷宫 提交 38 通过 1 时间限制 1.00s

c++t396758 [glfls 7d] 小熊走迷宫 提交 38 通过 1 时间限制 1.00s 内存限制 128.

题目背景:

我们用一个二维的字符数组来表示迷宫;其中字符 S 表示起点,字符 T 表示终点,字符 * 表示墙壁,字符 . 表示平地。你需要从S出发走到T,每次只能向上下左右相邻的位置移动,不能走出地图,也不能穿过墙壁,每个点只能通过一次。你需要编程来求解出一种从起点到终点的走法。

输入的第一行为两个整数,表示迷宫的行数和列数,中间用空格分开。下面每行为迷宫每行的样子。

要求输出从起点走到终点的路径,路径有字符 H 表示。

样例输入:

5 6

....S*

.***..

.*..*.

*.***.

.T....

样例输出:

.T....
....H*
.***HH
.*..*H
*.***H
.THHHH

示例代码:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. string maze[110];
  5. int n, m;
  6. bool vis[110][110];
  7. int dir[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};
  8. bool in(int x, int y)
  9. {
  10. if(x >= 0 && x < n && y >= 0 && y < m)
  11. {
  12. return true;
  13. }
  14. else
  15. {
  16. return false;
  17. }
  18. }
  19. bool dfs(int x, int y)
  20. {
  21. if(maze[x][y] == 'T')
  22. {
  23. return true;
  24. }
  25. vis[x][y] = 1;
  26. maze[x][y] = 'H';
  27. for (int i = 0; i < 4; i++)
  28. {
  29. int tx = x + dir[i][0];
  30. int ty = y + dir[i][1];
  31. if(in(tx,ty) && maze[tx][ty] != '*' && !vis[tx][ty]) //注意这里的判断条件必须
  32. { //把in(tx,ty)写在最前面
  33. if(dfs(tx,ty)) //否则string数组会越界
  34. {
  35. return true;
  36. }
  37. }
  38. }
  39. vis[x][y] = 0;
  40. maze[x][y] = '.';
  41. return false;
  42. }
  43. int main()
  44. {
  45. cin >> n >> m;
  46. for (int i = 0; i < n; i++)
  47. {
  48. cin >> maze[i];
  49. }
  50. int x, y;
  51. for (int i = 0; i < n; i++)
  52. {
  53. for (int j = 0; j < m; j++)
  54. {
  55. if(maze[i][j] == 'S')
  56. {
  57. x = i, y = j;
  58. }
  59. }
  60. }
  61. if(dfs(x,y))
  62. {
  63. for (int i = 0; i < n; i++)
  64. {
  65. cout << maze[i] << endl;
  66. }
  67. }
  68. else
  69. {
  70. cout << "NO!" << endl;
  71. }
  72. return 0;
  73. }

运行截图:

题目改为:求从起点到终点最少所需的步数。

示例代码(DFS):

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. string maze[110];
  5. int n, m;
  6. bool vis[110][110];
  7. int dir[4][2] = { {-1,0},{0,-1},{1,0},{0,1} };
  8. int ans = 100000000; //足够大保证最短路能够更新
  9. bool in(int x, int y)
  10. {
  11. if (x >= 0 && x < n && y >= 0 && y < m)
  12. {
  13. return true;
  14. }
  15. else
  16. {
  17. return false;
  18. }
  19. }
  20. void dfs(int x, int y, int step)
  21. {
  22. if (maze[x][y] == 'T') //基线条件
  23. {
  24. if (step < ans)
  25. {
  26. ans = step;
  27. }
  28. return;
  29. }
  30. vis[x][y] = 1;
  31. for (int i = 0; i < 4; i++)
  32. {
  33. int tx = x + dir[i][0];
  34. int ty = y + dir[i][1];
  35. if (in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty])
  36. {
  37. dfs(tx, ty, step + 1);
  38. }
  39. }
  40. vis[x][y] = 0; //一定要取消标记
  41. }
  42. int main()
  43. {
  44. cin >> n >> m;
  45. for (int i = 0; i < n; i++)
  46. {
  47. cin >> maze[i];
  48. }
  49. int x, y;
  50. for (int i = 0; i < n; i++)
  51. {
  52. for (int j = 0; j < m; j++)
  53. {
  54. if (maze[i][j] == 'S')
  55. {
  56. x = i, y = j;
  57. }
  58. }
  59. }
  60. dfs(x, y, 0);
  61. cout << ans << endl;
  62. return 0;
  63. }

示例代码(BFS):

  1. #include<iostream>
  2. #include<string>
  3. #include<queue>
  4. using namespace std;
  5. int n, m;
  6. bool vis[101][101];
  7. string maze[101];
  8. int dir[4][2] = {-1,0,0,-1,1,0,0,1};
  9. bool in(int x, int y){
  10. return 0 <= x && x < n && 0 <= y && y < m;
  11. }
  12. struct node{
  13. int x, y, d;
  14. node(){}
  15. node(int _x, int _y, int _d):x(_x),y(_y),d(_d){}
  16. };
  17. int bfs(int sx, int sy){
  18. queue<node> q;
  19. q.push(node(sx,sy,0));
  20. vis[sx][sy] = 1;
  21. while (!q.empty()){
  22. node now = q.front();
  23. q.pop();
  24. for (int i = 0; i < 4; i++){
  25. int tx = now.x + dir[i][0];
  26. int ty = now.y + dir[i][1];
  27. if (in(tx,ty) && maze[tx][ty] != '*' && !vis[tx][ty]){
  28. if (maze[tx][ty] == 'T'){
  29. return now.d + 1;
  30. } else {
  31. vis[tx][ty] = 1;
  32. q.push(node(tx, ty, now.d + 1));
  33. }
  34. }
  35. }
  36. }
  37. return -1;
  38. }
  39. int main(){
  40. cin >> n >> m;
  41. for (int i = 0; i < n; i++){
  42. cin >> maze[i];
  43. }
  44. int x, y;
  45. for (int i = 0; i < n; i++){
  46. for (int j = 0; j < m; j++){
  47. if (maze[i][j] == 'S'){
  48. x = i, y = j;
  49. }
  50. }
  51. }
  52. cout << bfs(x, y) << endl;
  53. return 0;
  54. }

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

闽ICP备14008679号