题目描述
给一张个迷宫,问能否从起点走到终点,只能往上下左右走,不能斜着走
输入
多组测试数据,每组第一行两个正整数,分别为n和m
表示n这个迷宫有n行m列(0<n,m<10)
接着是n行m列,
'#'表示路
‘*’表示墙
‘S’表示起点
‘T’表示终点
输出
每组测试数据输出一个结果,如果能从S走到T,输出“YES”,否则输出“NO”
样例输入
2 2
S*
#T
3 3
S*#
#T
##
样例输出
YES
NO
分析与解答
我们先从第一个走的,因此先把第一个格子标记为已走过,然后开始走第一个格子上下左右的相邻格子,如果这个相邻格子没走过,而且从这个相邻格子能走到下一个格子,那么就可以一直走下去,继续调用dfs。
当调用dfs直到无法走下一个格子,这时直接返回flag=0,然后回到上一个格子,直到返回到最开始的那个格子,此时最开始的格子走另一个方向的格子。然后继续重复之前的调用,直到找到终点。
code:
#include<bits/stdc++.h>
using namespace std;
int n,m,flag;
int vis[15][15];//vis辅助数组
char a[15][15];
int step_x[4]= {-1,1,0,0},step_y[4]= {0,0,-1,1};//方向数组,左右四个方向;
void DFS(int x,int y)
{
vis[x][y]=1;//标记一个起点使用过
if(a[x][y]=='T')
{
flag=1;
return;
}
for(int i=0; i<4; i++)//上下左右找路
{
int h=x+step_x[i];
int l=y+step_y[i];
if(a[h][l]!='*'&&!vis[h][l]&&h>=0&&h<n&&l>=0&&l<m)//搜索的条件
{
DFS(h,l);//递归调用DFS函数找路
}
}
}
int main()
{
while(cin>>n>>m)
{
memset(vis,0,sizeof(vis));//初始化vis数组的值为0
int f,g;
flag=0;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cin>>a[i][j];
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(a[i][j]=='S')
{
f=i;
g=j;
}
}//记录起点的下标,从起点开始使用DFS函数
DFS(f,g);
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}