Description
给一张个迷宫,问能否从起点走到终点,只能往上下左右走,不能斜着走
Input
多组测试数据,每组第一行两个正整数,分别为n和m
表示n这个迷宫有n行m列(0<n,m<10)
接着是n行m列,
'#'表示路
‘*’表示墙
‘S’表示起点
‘T’表示终点
Output
每组测试数据输出一个结果,如果能从S走到T,输出“YES”,否则输出“NO”
Sample Input
2 2
S*
#T
3 3
S*#
#*T
##*
Sample Output
YES
NO
注释:一开始用dfs一直超限,有地方错了找了半天没找出来,看了大佬的dfs代码,有一处没看懂,只好改用bfs。
代码:
#include<bits/stdc++.h>
using namespace std;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int a1,a2,b1,b2,c1,c2;
int map1[15][15];
char way[15][15];
struct ww{
int x,y;
ww(){};
ww(int xx,int yy):x(xx),y(yy){}
}s[10000];
int n,m;
int main(){
while(~scanf("%d %d",&n,&m)){
memset(map1,0,sizeof(map1));
memset(way,'\0',sizeof(way));
memset(s,0,sizeof(s));
for(int i=0;i<n;i++){
getchar();
scanf("%s",way+i);
for(int j=0;j<m;j++){
if(way[i][j]=='S'){
a1=i;a2=j;
}
}
}
ww a;
int l,r,flag=0;
l=r=0;
s[r++]=ww(a1,a2);
map1[a1][a2]=1;
while(l<r){
a=s[l++];
if(way[a.x][a.y]=='T'){
flag=1;break;
}
for(int i=0;i<4;i++){
int xx=a.x+dir[i][0];
int yy=a.y+dir[i][1];
if(map1[xx][yy]==0&&xx>=0&&xx<n&&yy>=0&&yy<m&&way[xx][yy]!='*'){
s[r++]=ww(xx,yy);
map1[xx][yy]=1;
}
}
}
if(flag)printf("YES\n");
else printf("NO\n");
}
}