• [C语言、C++]数据结构作业:用递归实现走迷宫(打印正确通路即可)


    如果是非递归情况 

    如果当前点(方格)为出口,则成功退出 (否则)

    如果可继续走(向相邻点试探),存在某个可前进 的相邻点(分支)则:

    1、将当前点保存,以便回退

    2、将相邻点作为当前点继续(该分支)

    如果不能前进则:

    1、取出最近保存的点,回退作为当前点

    2、如果无法取出,则无通路,失败退出 

    接下来考虑递归情况

     

    1. #include
    2. using namespace std;
    3. typedef struct ElemType{
    4. int x;
    5. int y;
    6. };
    7. typedef struct StackNode { //栈元素结点定义
    8. ElemType data; //结点数据
    9. StackNode* next; //结点链接指针
    10. }*LinkStack; //链式栈
    11. void InitStack(LinkStack& S) { //栈初始化
    12. S = NULL; //栈顶(链头)指针置空
    13. }
    14. int IsEmpty(const LinkStack& S) { //判栈空否
    15. return S == NULL;
    16. }
    17. int Push(LinkStack& S, ElemType& e) { //进栈
    18. StackNode* s = new StackNode;
    19. if (!s) exit(1); //可省略
    20. s->data = e; //结点赋值
    21. s->next = S; S = s; //链入栈顶
    22. return 1;
    23. }
    24. int Pop(LinkStack& S, ElemType& e) { //出栈
    25. if (IsEmpty(S)) return 0;
    26. StackNode* q = S;
    27. S = q->next; e = q->data; //摘下原栈顶
    28. delete q; return 1; //释放原栈顶结点
    29. }
    30. void ReTraverse(const LinkStack& S) {
    31. if (S) {
    32. ReTraverse(S->next);
    33. cout << "("<data.x<<","<data.y<<")"<
    34. }
    35. }
    36. void Go(ElemType start, ElemType end,int map[][10],LinkStack &S) {
    37. ElemType e; ElemType a;
    38. if (map[start.x][start.y] == 0) {
    39. if (start.x == end.x && start.y == end.y) { Push(S, start); ReTraverse(S); }
    40. else {
    41. map[start.x][start.y] = 1;
    42. Push(S, start);
    43. ElemType startA; startA.x = start.x - 1; startA.y = start.y;
    44. ElemType startL; startL.y = start.y - 1; startL.x = start.x;
    45. ElemType startV; startV.x = start.x + 1; startV.y = start.y;
    46. ElemType startR; startR.y = start.y + 1; startR.x = start.x;
    47. Go(startA, end,map,S);
    48. Go(startL, end, map, S);
    49. Go(startV, end, map, S);
    50. Go(startR, end, map, S);
    51. map[start.x][start.y] = 2;
    52. Pop(S, e);
    53. }
    54. }
    55. }
    56. int main(){
    57. LinkStack S; InitStack(S);
    58. ElemType start; ElemType end;
    59. start.x = 1; start.y = 1;
    60. end.x = 8; end.y = 8;
    61. int map[10][10] =//用二维数组表示地图:9代表墙,0代表通路
    62. {
    63. { 9,9,9,9,9,9,9,9,9,9 },
    64. { 9,0,0,9,0,0,0,9,0,9 },
    65. { 9,0,0,9,0,0,0,9,0,9 },
    66. { 9,0,0,0,0,9,9,0,0,9 },
    67. { 9,0,9,9,9,0,0,0,0,9 },
    68. { 9,0,0,0,9,9,0,0,0,9 },
    69. { 9,0,9,0,0,0,9,0,9,9 },
    70. { 9,0,9,9,9,0,9,9,0,9 },
    71. { 9,9,0,0,0,0,0,0,0,9 },
    72. { 9,9,9,9,9,9,9,9,9,9 }
    73. };
    74. Go(start, end, map, S);
    75. }

     用二维数组表示地图,

    Go函数内部设计思路见图:

    首先该位置必须为0,即不能为"墙"才能行走,其次如果该位置是终点,则为递归的“出口”,则结束

    否则进入递归最小问题:该位置从0标记为1记为走过的路,但因为不能再次走所以不能为0,入栈,之后分别计算上下左右的临近点坐标,挨个调用进行递归,若都失败弹出,则说明进入到了死胡同,标记出栈的位置为2,即为回退的路,与走过的路“1”做区分,然后出栈

    完成以上步骤即可得出最终路径:

     

  • 相关阅读:
    Spring循环依赖解决
    CompletableFuture异步编排(两任务组合——两个任务必须都完成才触发另一个任务 )
    sqlite3日期时间格式化和自动输入
    Spring的开幕式——Spring概述与设计思想
    python安全工具开发笔记(二)——python Web编程
    【MindSpore易点通】常用性能调优方法经验总结
    【饭谈】软素质怎么提高?(适合软件测试人的专用办法)
    maven-metadata.xml
    电机的基础知识
    在瑞芯微 Rockchip SDK中增加自己的程序并使用CMake编译
  • 原文地址:https://blog.csdn.net/ZDEWBYE/article/details/127721807