首页 > 代码库 > nefu558 bfs

nefu558 bfs

Description

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

Input

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

Output

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

Sample Input

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

Sample Output

YESNO

 

AC代码:

#include<cstdio>#include<cstring>#include<queue>using namespace std;char str[1005][1005];bool flag[1005][1005];int dri[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};struct Door{    int x,y;} door[2];int bfs(int n,int m){    memset(flag,false,sizeof(flag));    queue<Door>q;    Door now,next;    q.push(door[0]);    flag[door[0].x][door[0].y]=true;    while(!q.empty())    {        now=q.front();        q.pop();        if(now.x==door[1].x && now.y==door[1].y) return 1;        for(int i=0; i<4; i++)        {            next.x=now.x+dri[i][0];            next.y=now.y+dri[i][1];            if(next.x>=0&&next.x<n && next.y>=0&&next.y<m && next.x==door[1].x && next.y==door[1].y) return 1;            else if(next.x>=0&&next.x<n && next.y>=0&&next.y<m && !flag[next.x][next.y] && str[next.x][next.y]==*)            {                q.push(next);                flag[next.x][next.y]=true;            }        }    }    return -1;}int main(){    int n,m,i;    while(scanf("%d%d",&n,&m)==2)    {        getchar();        for(i=0; i<n; i++)            scanf("%s",str[i]);        int num=0;        for(i=0; i<m; i++)        {            if(str[0][i]==*)            {                door[num].x=0;                door[num].y=i;                num++;            }            if(str[n-1][i]==*)            {                door[num].x=n-1;                door[num].y=i;                num++;            }        }        for(i=1; i<n-1; i++)        {            if(str[i][0]==*)            {                door[num].x=i;                door[num].y=0;                num++;            }            if(str[i][m-1]==*)            {                door[num].x=i;                door[num].y=m-1;                num++;            }        }        int ans=bfs(n,m);        if(ans==1) printf("YES\n");        if(ans==-1) printf("NO\n");    }    return 0;}

 

nefu558 bfs