1185: 走迷宫
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 267 Solved: 101
[ Submit][ Status][ Web Board]
Description
给一张个迷宫,问能否从起点走到终点,只能往上下左右走,不能斜着走
Input
多组测试数据,每组第一行两个正整数,分别为n和m
表示n这个迷宫有n行m列(0<n,m<10)
接着是n行m列,
'#'表示路
‘*’表示墙
‘S’表示起点
‘T’表示终点
Output
每组测试数据输出一个结果,如果能从S走到T,输出“YES”,否则输出“NO”
Sample Input
2 2S*#T3 3S*##*T##*
Sample Output
YESNO
HINT
Source
思路:最简单的dfs了,也是最基础的,通常很多的dfs都是递推。本人第一次学搜索dfs算法的一道题目。还是自己太菜了。得好好努力了
代码:
#include<cstdio>
#include<cstring>
const int N=15;
char maze[N][N];
int v[N][N];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int n,m;
bool flag;
void dfs(int x,int y)
{
v[x][y]=1;
if(maze[x][y]=='T'){
flag=true;
return;
}
for(int i=0; i<4; i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(0<=nx&&nx<n&&0<=ny&&ny<m&&maze[nx][ny]!='*'&&v[nx][ny]==0)
{
dfs(nx,ny);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
flag=false;
memset(v,0,sizeof(v));
memset(maze,'\0',sizeof(maze));
for(int i=0; i<n; i++){
getchar();
scanf("%s",maze+i);
}
int p,q;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(maze[i][j]=='S'){
p=i;
q=j;
break;
}
}
}
dfs(p,q);
if(flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}