- 搜索的本质:暴力枚举,尝试所有可能的方案。
- 深搜的特点:不撞南墙不回头。撞到南墙就回溯。
- 适用场景:判断连通性。
代码:
方向数组:
int dir[4][2]={0,1,1,0,0,-1,-1,0};
小技巧:地图从(1,1)点开始存,最外圈都是0,这样做的好处就是不用判断边界。
#include <iostream>
using namespace std;
int n,m,sx,sy;//n,m:地图的宽和长,(sx,sy)起始点坐标
int dir[4][2]={0,1,1,0,0,-1,-1,0};//方向数组
char mmap[105][105];
int func(int x,int y){
for(int i=0;i<4;i++){//遍历四个方向
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(mmap[xx][yy]=='T'){//找到终点就返回1
return 1;
}
if(mmap[xx][yy]=='.'){//如果下一个坐标不是障碍,就搜索这个坐标
mmap[xx][yy]=0; //标记已经走过
if(func(xx,yy)==1){//递归下一层,同时判断返回值是否为1.
return 1;
}
}
}
return 0;//没找到就返回0
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){ //从(1,1)点开始存
for(int j=1;j<=m;j++){
cin>>mmap[i][j];
if(mmap[i][j]=='S'){//标记起始坐标点
sx=i;sy=j;
}
}
}
if(func(sx,sy)==1){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
return 0;
}