无限套娃(递归)的强行挣脱!!!

问题代码:

#include<iostream>
#include<vector>
using namespace std;

vector<vector<int>> maze;   //迷宫矩阵
int N, M;                   //N为行,M为列

//-----链队存储结构---------
typedef struct QNode {
    int x;
    int y;
    QNode* next;
}*QueuePtr;
typedef struct {
    QueuePtr front;         //队头指针
    QueuePtr rear;          //队尾指针
}LinkQueue;

LinkQueue path_temp;        //存储路径

void InitQueue(LinkQueue& Q) {      //链队的初始化
    Q.front = Q.rear = new QNode;   //生成新结点作为头结点,队头和队尾指针都指向此结点
    Q.front->next = nullptr;        //头结点的指针域置空
}

void EnQueue(LinkQueue& Q, int x, int y) {        //入队
    if(Q.front==nullptr)return;
    QNode* p = new QNode;                        //为入队元素分配结点空间,用指针p指向
    p->x = x;
    p->y = y;
    p->next = nullptr;                           //将新结点的指针域置空
    Q.rear->next = p;                            //用前一结点的指针指向新结点
    Q.rear = p;                                  //修改队尾指针
}

void ReadQueue(LinkQueue Q) {           //遍历链队
    QNode* p = new QNode;
    p = Q.front;
    while (p->next != nullptr) {        //遍历
        p = p->next;
        cout << "(" << p->x << "," << p->y << ")" << endl;
    }
}

void MazeTrack(int i, int j){
    EnQueue(path_temp, i, j);                        //将当前节点加入到路径中
    maze[i][j] = 1;
    if (i == N - 1 && j == M - 1)                     //判断是否到达终点
        cout << "到达终点!" << endl;
    if (j + 1 < M && maze[i][j + 1] == 0) {          //探索向右走是否可行
        
        MazeTrack(i, j + 1);
    }
    if (i + 1 < N && maze[i + 1][j] == 0) {          //探索向下走是否可行
        
        MazeTrack(i + 1, j);
    }
    if (i - 1 >= 0 && maze[i - 1][j] == 0) {         //探索向上走是否可行
                                 
        MazeTrack(i - 1, j);
    }
    if (j - 1 >= 0 && maze[i][j - 1] == 0) {         //探索向左走是否可行
        
        MazeTrack(i, j - 1);
    }
}

int main(){
    cout << "输入数据:" << endl;
    while (cin >> N >> M){
        maze = vector<vector<int>>(N, vector<int>(M, 0));
        for (auto& i : maze)
            for (auto& j : i)
                cin >> j;               
        InitQueue(path_temp);           //初始化
        MazeTrack(0, 0);                //回溯寻找迷宫最短通路
        ReadQueue(path_temp);           //遍历链队
    }
    return 0;
}

运行结果:

在这里插入图片描述

问题分析:

本来到(4,4)就应该停止的,但是因为Main中的while循环没结束,所以 会运行返回到MazeTrack函数中的MazeTrack()语句,之后一直递归,无限套娃!!!

排除代码中本来的BUG,就说无限递归这个令人崩溃的现象,我们要怎么做才能跳出这个死循环,飞向自由的天空???

方法:设置一个高权限的全局变量,用if()return;来阻止陷入死循环的递归,挣脱无限“套娃”。

bool isGo=true;			//全局变量
void Fun(){ 
// .................
isGo = false ;
if(isGo == false) return ;	//阻止递归
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Driver.SHAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值