原题链接:信息学奥赛一本通T1255-迷宫问题
解题思路:
因为不知道怎么打印路径所以不会做这道题,看了一些题解才明白,当前位置储存上一个位置,记录是从哪里走来的,然后再倒序寻找前面的坐标。
不过这个倒序寻找太麻烦了,这是我按照题解写的倒序寻找

逻辑还算清楚,但是写起来实在麻烦。
直到我做了这道题1923: 蓝桥杯算法提高VIP-学霸的迷宫,是用的在结构体里放置一个存储数组,数组记录从开始到现在的位置,打印的时候直接遍历输出就可以了。
感觉这道题可以这么做,所以在结构体里放置了一个string(因为string打印方便,存放的时候不需要像数组一样获取长度存储),然后用string记录从0,0到4,4的每一步,然后直接输出。
因为不是简单的bfs找长度,所以我就不解释bfs模板了,详见代码注释。
参考代码:
#include <bits/stdc++.h>
#include <queue>
using namespace std;
const int S=5;
struct node{
int x,y;
string s; //存放位置
};
int dx[4]={1,0,0,-1};
int dy[4]={0,-1,1,0};
bool vis[S][S];
int p[S][S];
queue<node>q;
void bfs(int n,int m){
q.push(node{0,0}); //开始在0,0处
while(!q.empty()){
node now=q.front();//获取队首位置
vis[now.x][now.y]=1;
q.pop();
if(now.x==n-1&&now.y==m-1){
for(int i=0;i<now.s.size();i+=2){//打印
cout<<"("<<now.s[i]<<", "<<now.s[i+1]<<")"<<endl;
}
cout<<"(4, 4)";//因为不存放自身的位置,所以需要单独打印
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]==0&&vis[x][y]==0){//可以走且没有走过
vis[x][y]=1;
node nom=now;//现在num.s已经存放了now.s记录的位置(核心代码)
nom.x=x;
nom.y=y;
nom.s+=now.x+'0';//将上一步的位置坐标新增到s里面(核心代码)
nom.s+=now.y+'0';
q.push(nom);
}
}
}
}
}
int main()
{
int n=5,m=5;
for(int i=0;i<n;i++){
for(int j=0;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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复