时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。
小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。
障碍物不能通过。小明如果现在在点(x,y)处,那么下一步只能走到相邻的四个格子中的某一个:(x+1,y),(x-1,y),(x,y+1),(x,y-1);
小明想要知道,现在他能否从起点走到终点。
输入描述:
本题包含多组数据。
每组数据先输入两个数字N,M
接下来N行,每行M个字符,表示地图的状态。
数据范围:
2<=N,M<=500
保证有一个起点S,同时保证有一个终点E.
输出描述:
每组数据输出一行,如果小明能够从起点走到终点,那么输出Yes,否则输出No
示例1
输入
3 3 S.. ..E ... 3 3 S## ### ##E
输出
Yes No
分析:简单BFS。
#include<cstdio> #include<cstring> #include<queue> using namespace std; char map[600][600]; char s[100]; bool vis[600][600]; struct Node{ int x,y; }; int d[4][2]={0,1,0,-1,1,0,-1,0}; int main() { int N,M; while(scanf("%d%d",&N,&M)!=EOF) { Node S; gets(s); for(int i=1;i<=N;i++) { for(int j=1;j<=M;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='S') {S.x=i;S.y=j;} } gets(s); } int flag=0; memset(vis,0,sizeof(vis)); queue<Node> q; q.push(S); while(!q.empty()) { Node temp=q.front(); q.pop(); if(map[temp.x][temp.y]=='E') {flag=1;break;} vis[temp.x][temp.y]=1; for(int i=0;i<4;i++) { Node R; R.x=temp.x+d[i][0];R.y=temp.y+d[i][1]; if(R.x<1||R.y<1||R.x>N||R.y>M) continue; if(!vis[R.x][R.y]&&map[R.x][R.y]!='#') { vis[R.x][R.y]=1; q.push(R); } } } if(flag) printf("Yes "); else printf("No "); } return 0; }