深度优先搜索
深搜全称是深度优先搜索,英文缩写DFS。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
深搜的核心是:能深则深,不能深就退。
寻找师傅
【问题描述】
唐僧师徒在取经路上再一次走失了,这一次狡猾的妖怪将唐僧藏入了形如迷宫的洞穴中,已知妖怪洞穴是一个NN的正方形,其中有一些假山堵路。
输入:第一行是一个正整数N(2<N<10),后面包含NN行由0,·1,2组成的矩阵,其中0表示可以走,1表示假山,2表示师傅的位置。
输出:如果悟空和八戒可以救出师傅就输出YES,否则就输出NO。
【样例输入】
5
0 1 0 1 0
0 0 0 0 0
0 1 1 0 1
0 0 1 0 1
0 1 0 0 2
【样例输出】
YES
【代码示例】
#include<iostream>
using namespace std;
int dx[5]={-1,0,1,0},dy[5]={0,1,0,-1};
int G[105][105],vis[105][105]; //G:用来存储地图,vis:标记点的状态(是否走过)
int n; //n:地图的长宽
bool f = false; //标记深搜结果
void dfs(int x,int y){
//如果找到师傅,结束
if(G[x][y]==2){
f=true;
return;
}
for(int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=0 && xx<n && yy>=0 && yy<n && G[xx][yy]!=1 && vis[xx][yy]==0) {
vis[xx][yy]=1;
dfs(xx,yy);
vis[xx][yy]=0;
}
}
}
int main() {
cin >> n;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin >> G[i][j];
}
}
if(G[0][0]==1){
cout << "NO" << endl;
return 0;
}else if(G[0][0]==2){
cout << "YES" << endl;
return 0;
}else{
vis[0][0] = 1; //标记0 0位置搜索过了
dfs(0,0);// 开始深搜
if(f){
cout << "YES" << endl;
}else{
cout << "NO" << endl;
}
return 0;
}
}