NEFU 558 DFS

来源:互联网 发布:中国文化产业现状知乎 编辑:程序博客网 时间:2024/06/16 01:45

NEFU 558:点击打开链接

迷宫寻路

Problem:558

Time Limit:1000ms

Memory Limit:65536K

Description

AC小公主很喜欢设计迷宫,她设计的迷宫只有两个口,一个入口,一个出口。但小公主有时候很调皮,她会让挑战者走不出迷宫。现在给你AC小公主的迷宫请你判断挑战者能否成功从出口走出迷宫,迷宫包证边界为障碍物,只有两个不同的入口。“#”代表障碍物,“*”代表可走的路。

Input

输入有多组,每组输入两个正整数n,m( 2 < n < m < 1000)。接下来n行,每行有m个字符。

Output

每组测试实例,若挑战者能走出迷宫输出”YES”,否则输出“NO”。

Sample Input

3 3#*##*##*#3 3#*#####*#

Sample Output

YESNO

Hint

Source


难度:水(DFS基础题)
AC代码:
#include <iostream>#include <cmath>#include <cstdio>#include <cstring>using namespace std;int n,m;char a[1005][1005];bool is_way(int x,int y,int si,int sj){    if(x==0||x>n||y==0||y>m)    {        if(abs(si-x)+abs(sj-y)!=1)            return 1;        else            return 0;    }    else if(a[x][y]=='*')    {        a[x][y]='#';        int ans=is_way(x-1,y,si,sj)+is_way(x+1,y,si,sj)+is_way(x,y-1,si,sj)+is_way(x,y+1,si,sj);        if(ans>0)            return 1;        else            return 0;    }    else        return 0;}int main(){    while(scanf("%d %d",&n,&m)!=EOF)    {        getchar();        memset(a,0,sizeof(a));        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)                scanf("%c",&a[i][j]);            getchar();        }        int ans=0;        for(int i=1;i<=n&&!ans;i++)            if(a[i][1]=='*')                ans=is_way(i,1,i,1);        for(int i=1;i<=n&&!ans;i++)            if(a[i][m]=='*')                ans=is_way(i,m,i,m);        for(int j=1;j<=m&&!ans;j++)            if(a[1][j]=='*')                ans=is_way(1,j,1,j);        for(int j=1;j<=m&&!ans;j++)            if(a[n][j]=='*')                ans=is_way(n,j,n,j);        if(ans) cout<<"YES"<<endl;        else cout<<"NO"<<endl;    }}


0 0
原创粉丝点击