原题链接:信息学奥赛一本通T1252-走迷宫
解题思路:
可以把bfs当成扩散问题,如果下一步可以走,就向下一步扩散,直到遇见终点,停止循环。
参考代码:
#include <bits/stdc++.h> #include <queue> using namespace std; const int S=41;//题目范围最大为40 struct node{ int x,y,l;//横坐标和纵坐标 l为当前为第几步 }; int dx[4]={1,-1,0,0};//上 下 左 右 int dy[4]={0,0,-1,1}; bool vis[S][S];//记录走没有走过 char p[S][S]; queue<node>q;//队列 void bfs(int n,int m){ q.push({1,1,1}); //起点从(1,1)开始 当前为第一步 while(!q.empty()){//队列不为空 node now=q.front(); vis[now.x][now.y]=1;//走过 标记为1 q.pop();//取出队首 (队首已经在新创建的now中) if(now.x==n&&now.y==m){//找到终点,打印,结束循环 cout<<now.l<<endl; break; } for(int i=0;i<4;i++){//上下左右的寻找 int x=now.x+dx[i]; int y=now.y+dy[i]; if(x>0&&y>0&&x<=n&&y<=m){ if(p[x][y]=='.'&&vis[x][y]==0){//可以走而且没有走过,放入队列 vis[x][y]=1;//已经走过了,标记为1 q.push({x,y,now.l+1}); } } } } } int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>p[i][j]; } } bfs(n,m); return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复