C++ 深度优先搜索(DFS) 讲解
1 DFS初步概念
DFS是一种深度搜索算法,它的特点是"不撞南墙不回头",运用递归对不同方向的结果进行搜索。
2 DFS例题-迷宫游戏
2.1 题目描述
这是一个迷宫游戏,有一个\(n \times n\)的矩阵,矩阵内只能有#
或.
这两种字符,如果是#
则是墙,如果是.
则是可以走的路。起点是左上角,终点是右下角,每次只能往上、下、左、右四个方向走。
请你写一个程序,判断这个迷宫是否可以从起点走到终点。
2.2 输入输出格式
第\(1\)行一个整数\(n\),代表矩阵大小为\(n \times n\)。
第\(2\)~\(n+1\)行输入\(n \times n\)的迷宫矩阵。
输出此迷宫是否能从起点走到终点,可以输出yes
,不可以输出no
。
2.3 输入输出样例
2.3.1 输入#1
5
..##.
#..##
..###
.####
.....
2.3.2 输出#1
yes
2.3.3 输入#2
5
..###
...##
..##.
##...
.##..
2.3.4 输出#2
no
2.4 解题思路
用char
类型的二维数组maze
存储输入的迷宫矩阵,用int
类型的二维数组visited
存储走过的地方,再用int
类型的变量pass
记录是否走完迷宫,pass
初始值设为\(0\),visited
所有元素初始值设为\(0\),maze
与visited
的下标是对应的,如果maze
中的地方是#
,则可以将visited
相同下标元素的值设为\(1\),再深度搜索可能的情况,若判断成功走到终点,则将pass
设为\(1\)并结束递归。
2.5 代码
#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
int n,visited[105][105]={},dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},pass=0;//迷宫大小,标记数组,方向数组,是否通过
char maze[105][105]={};//迷宫数组
void dfs(int x,int y) {
if(x==n-1&&y==n-1) {//到达终点
pass = 1;
return ;
}
for(int i=0;i<4;i++) {
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0&&nx<=n-1&&ny>=0&&ny<=n-1&&visited[nx][ny]==0) {
visited[nx][ny] = 1;
dfs(nx,ny);//符合条件,开始递归
}
}
}
int main() {
cin >> n;//输入迷宫大小
for(int i=0;i<n;i++) {//输入迷宫数组
for(int j=0;j<n;j++) {
cin >> maze[i][j];
if(maze[i][j]=='#') {
visited[i][j] = 1;
}
}
}
if(visited[0][0]==1||visited[n-1][n-1]==1) {//起点或终点是墙
cout << "No" << endl;
system("pause");
return 0;
}
dfs(0,0);//执行函数
if(pass==1) {//通过
cout << "Yes" << endl;
}
else {//未通过
cout << "No" << endl;
}
system("pause");
return 0;
}