问题代码:
#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 ; //阻止递归
}