zzuoj 10428: 奇怪的梦 (bfs)水

来源:互联网 发布:伦佐皮亚诺 知乎 编辑:程序博客网 时间:2024/06/05 08:53

10428: 奇怪的梦

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 77  Solved: 23
[Submit][Status][Web Board]

Description

spy常常做梦,有一天,他梦到他来到一片沼泽,好怕怕。。
这里为了简化问题,把沼泽看成一个二维矩阵。
spy起始点在S。
要想离开这个沼泽地只能到达E才行。
除了起始点S和离开点E之外还有平地和沼泽地,分别用.和#表示。
平地表示可以走,沼泽地是很危险的,所以不能走。spy每次走只能往上下左右其中一个方向走一步。
然后他希望能够离开这里,所以你能够帮他吗?

Input

多组测试数据。
每一组数据第一行有两个整数n,m(0 < n <= 100, 0 < m <= 100)。接下来是一个n*m的矩阵。'.'表示平地,‘#’表示沼泽,S表示起始位置,E表示终点。

Output

对于每一组数据输出一个“Yes”或者“No”,表示spy能否离开这里。

Sample Input

2 2S#.E3 3S.#.#.#.E

Sample Output

YesNo

HINT

注意这里S有且仅有一个,E可能有0个到多个。

#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>using namespace std;int n,m;int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};char a[110][110];int b[110][110];struct zz{int x;int y;}f1,f2;void bfs(int x,int y){queue<zz>q;memset(b,0,sizeof(b));f1.x=x;f1.y=y;b[x][y]=1;q.push(f1);while(!q.empty()){f1=q.front();q.pop();if(a[f1.x][f1.y]=='E'){printf("Yes\n");return ;}for(int i=0;i<4;i++){f2.x=f1.x+dx[i];f2.y=f1.y+dy[i];if(f2.x>=0&&f2.x<n&&f2.y>=0&&f2.y<m&&!b[f2.x][f2.y]&&a[f2.x][f2.y]!='#'){b[f2.x][f2.y]=1;q.push(f2);}}}printf("No\n");}int main(){int i,j;int sx,sy;while(scanf("%d%d",&n,&m)!=EOF){for(i=0;i<n;i++)scanf("%s",a[i]);for(i=0;i<n;i++){for(j=0;j<m;j++){if(a[i][j]=='S'){sx=i;sy=j;}}}bfs(sx,sy);}return 0;}


 

0 0