原题链接:信息学奥赛一本通T1252-走迷宫
解题思路:
bfs刚好满足于queue的逻辑,
运用queue对每次新的坐标入队
具体代码如下
参考代码:
#include<iostream>
#include<queue>
using namespace std;
const int MAXC = 1000;
int r,c;
char mapp[MAXC][MAXC];
int vis[MAXC][MAXC];
int start_x,start_y;
int end_x,end_y;
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void bfs(){
//这是一个队列(queue)的定义,其中每个元素是一个pair类型,pair中包含两个int类型的元素。
queue<pair<int , int >> q;
//其中q是一个queue类型的变量,make_pair(start_x, start_y)是一个pair类型的变量,
//表示一个二元组,将start_x和start_y打包在一起。这行代码的作用是将这个二元组压入队列q中。
q.push(make_pair(start_x,start_y));
vis[start_x][start_y] = 1;
//因为考虑到“计算步数要包括起点和终点。”所以step初始值给1表示起点步数
int step = 1;
while(!q.empty()){
int len = q.size();
while(len--){
int x = q.front().first; //取出的第一个数值被赋值给变量x
int y = q.front().second; //第二个数值被赋值给变量y
//这段代码是从队列(queue)中取出第一个元素,并将其弹出队列。
q.pop();
if(x == end_x && y == end_y){
//判断该坐标(x,y)是否到达终点(end_x,end_y)
cout<<step;
return;
}
for(int i=0;i<4;i++){
//将坐标(x,y)向四个方向分别偏移一定量,得到四个新的坐标(dx,dy)。
int dx = x + d[i][0];
int dy = y + d[i][1];
if(dx>0 && dx<=r && dy>0 && dy<=c && !vis[dx][dy] && mapp[dx][dy]=='.' ){
//枚举4个方向,合适的就入队
q.push(make_pair(dx,dy));
vis[dx][dy] = 1;
}
}
}
step++;
}
cout<<"not answer"; //没答案输出-1。因题目所给案例都可以走出迷宫,所以可以计较
}
int main(void){
cin>>r>>c;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>mapp[i][j];
}
}
start_x = 1;start_y = 1; //对起点进行标记,坐标赋值给start_x,start_y;
end_x = r; end_y = c; //对终点坐标进行标记
bfs();
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复