DFS——走出迷宫
题目描述
小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。
小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。
障碍物不能通过。小明如果现在在点(x,y)处,那么下一步只能走到相邻的四个格子中的某一个:(x+1,y),(x-1,y),(x,y+1),(x,y-1);
小明想要知道,现在他能否从起点走到终点。
输入描述:
本题包含多组数据。
每组数据先输入两个数字N,M
接下来N行,每行M个字符,表示地图的状态。
数据范围:
2<=N,M<=500
保证有一个起点S,同时保证有一个终点E.
输出描述:
每组数据输出一行,如果小明能够从起点走到终点,那么输出Yes,否则输出No
示例
输入
3 3
S…
…E
…
3 3
S##
##E
输出
Yes
No
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int x[4]={1,-1,0,0},y[4]={0,0,1,-1};
char f[505][505];
int n,m,flag;
int dfs(int a,int b)
{
int aa,bb;
flag=0;
if(f[a][b]=='E'){
return 1;
}
else{
for(int i=0;i<4;i++){
aa=a+x[i];
bb=b+y[i];
if(f[aa][bb]!='#'&&aa>=0&&aa<n&&bb>=0&&bb<m){
f[a][b]='#';
flag=dfs(aa,bb);
if(flag==1){
return 1;
}
else{
continue;
}
}
}
}
return 0;
}
int main()
{
while(cin>>n>>m){
int a,b;
for(int i=0;i<n;i++){
getchar();
for(int j=0;j<m;j++){
cin>>f[i][j];
if(f[i][j]=='S'){
a=i;
b=j;
}
}
}
if(dfs(a,b)){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
return 0;
}