#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
bool in(int x, int y){
return 0 <= x && x < n && 0 <= y && y < m;
}
queue<pair<int, int>> path; // 保存经过的路径
bool dfs(int x, int y){
if(maze[x][y] == 'T'){
return true;
}
vis[x][y] = 1;
maze[x][y] = 'm';
path.push({x, y}); // 将当前位置加入路径
for(int i = 0; i < 4; i++){
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty]){
if(dfs(tx, ty)){
return true;
}
}
}
vis[x][y] = 0;
maze[x][y] = '.';
path.pop(); // 将当前位置移出路径
return false;
}
int main(){
// 在适当的地方调用 dfs 函数进行搜索
// 打印经过的路径
while(!path.empty()){
pair<int, int> pos = path.front();
cout << "(" << pos.first << ", " << pos.second << ")" << endl;
path.pop();
}
return 0;
}
这是一个简单的dfs算法出迷宫的问题,在初学情况下不懂这个代码之中的定义的个个数组都是什么意思,今天来解析一下。
〈一〉在这个代码之中定义了一个vis数组,全称visited,是用来判断这个点是否经过并且用来保存得一个数组。
〈二〉在这个问题之中定义了vis[x][y]=1,以及vis[x][y]=0的两种情况等于1时相当于已经访问过,等于0就是还没被访问。
〈三〉return true和return两者的使用情况当返回true时则表明已经找到路径并且一条就够了直接返回并且不再查找,而使用return的时候则表明找到了就停止继续返回查找路径,一般这种情况用于查找最短路径问题的求解。
这是关系图: