zcmu-1185

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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值