当前位置:   article > 正文

PTA 7-6 迷宫-深度策略(g++)_pta走迷宫深度搜索算法

pta走迷宫深度搜索算法

先上代码~

  1. ```cpp
  2. #include<stdio.h> // 包含标准输入输出头文件
  3. #include<stdlib.h> // 包含标准库头文件
  4. #include<iostream> // 包含输入输出流头文件
  5. #include<stack> // 包含栈头文件
  6. #define size 100 // 定义数组大小为100
  7. int land[size][size] = { 0 }; // 定义一个地图数组并初始化为0
  8. using namespace std; // 使用命名空间std
  9. typedef struct point { // 定义一个结构体point
  10. int y; // 表示y坐标
  11. int x; // 表示x坐标
  12. }Node; // 结构体重命名为Node
  13. int help[8][2] = { {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}, {-1, 0}, {-1, 1}}; // 定义一个二维数组表示8个方向的移动
  14. // 定义一个函数用于查找可行路径
  15. bool find_way(int cur_y, int cur_x, int* xx, int* yy, int n)
  16. {
  17. for (int i = 0; i < 8; i++) // 遍历8个方向
  18. {
  19. *yy = cur_y + help[i][0]; // 更新y坐标
  20. *xx = cur_x + help[i][1]; // 更新x坐标
  21. if (*xx < n && *xx >= 0 && *yy < n && *yy >= 0) // 判断是否在地图范围内
  22. {
  23. if (land[*yy][*xx] == 0) // 判断是否为可行路径
  24. {
  25. return true; // 返回true
  26. }
  27. }
  28. }
  29. return false; // 返回false
  30. }
  31. int main() // 主函数
  32. {
  33. int n; // 定义变量n
  34. scanf("%d\n", &n); // 输入n的值
  35. for (int i = 0; i < n; i++) // 遍历地图数组
  36. {
  37. for (int j = 0; j < n; j++) // 遍历地图数组
  38. {
  39. scanf("%d", &land[i][j]); // 输入地图值
  40. }
  41. scanf("\n"); // 输入换行符
  42. }
  43. int s_y, s_x, e_y, e_x; // 定义起点和终点坐标
  44. scanf("%d %d %d %d", &s_y, &s_x, &e_y, &e_x); // 输入起点和终点坐标
  45. int cur_x, cur_y; // 定义当前坐标
  46. int xx, yy; // 定义新坐标
  47. stack<Node>s; // 定义一个栈存放节点
  48. Node t_node; // 定义一个节点
  49. t_node.y = s_y; // 节点y坐标赋值
  50. t_node.x = s_x; // 节点x坐标赋值
  51. s.push(t_node); // 将节点压入栈
  52. land[s_y][s_x] = 1; // 标记起点为已访问
  53. while (!s.empty()) // 当栈不为空时循环
  54. {
  55. cur_y = s.top().y; // 获取栈顶y坐标
  56. cur_x = s.top().x; // 获取栈顶x坐标
  57. if (find_way(cur_y, cur_x, &xx, &yy, n)) // 调用函数查找可行路径
  58. {
  59. t_node.y = yy; // 更新节点y坐标
  60. t_node.x = xx; // 更新节点x坐标
  61. land[yy][xx] = 1; // 标记新节点为已访问
  62. s.push(t_node); // 将新节点压入栈
  63. if (xx == e_x && yy == e_y) // 如果到达终点
  64. {
  65. break; // 跳出循环
  66. }
  67. }
  68. else {
  69. land[s.top().y][s.top().x] = 1; // 标记当前节点为已访问
  70. s.pop(); // 弹出栈顶元素
  71. }
  72. }
  73. while (!s.empty()) // 当栈不为空时循环
  74. {
  75. printf("%d %d;", s.top().y, s.top().x); // 输出路径坐标
  76. s.pop(); // 弹出栈顶元素
  77. }
  78. return 0; // 返回0表示正常结束
  79. }
  80. ```

代码亮点: 借鉴别人的一个特别优雅的解法, 即本代码中为了实现八个方向的探索,建立了一个help数组,这样在find_way中用一个for循环就可以实现探索~,避免了八“坨”if 语句(doge)

PS:看到网上有人说这题的测试数据是逆时针探寻, 本代码按顺时针做没什么有问题哦~

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

闽ICP备14008679号