链接:https://ac.nowcoder.com/acm/challenge/terminal
来源:牛客网
小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个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
输出
复制Yes No
解题思路:经典BFD
#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;} typedef long long ll; const int maxn = 1e5+10; char a[600][600]; int 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;//记录起点 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; if(a[i][j]=='S'){ S.x=i; S.y=j; } } } int flag=0; memset(vis,0,sizeof(vis));//清空标记数组 queue<node>q;//定义队列 q.push(S);//弹入起点 while(!q.empty()){ node temp=q.front();//判断 q.pop();//弹出站首 if(a[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.x<=n&&R.y>=1&&R.y<=m&&vis[R.x][R.y]==0&&a[R.x][R.y]!='#'){ vis[R.x][R.y]=1; q.push(R);//入栈等待判断 } } } if(flag==1){ printf("Yes "); } else{ printf("No "); } } return 0; }
AC代码2;
#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);//getchar(); 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; }