zcmu-1185

来源:互联网 发布:淘宝手机可以开店吗 编辑:程序博客网 时间:2024/05/09 13:39

1185: 走迷宫

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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;}




原创粉丝点击