BFS迷宫问题
链接: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\n"); } else{ printf("No\n"); } } 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\n"); else printf("No\n"); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具