原题链接:信息学奥赛一本通T1255-迷宫问题
解题思路:
这里就只说一下记录路径的问题吧,既然写到这个题目了,BFS和DFS基本用法都基本掌握了吧。
这里使用一位数组记录路径pre[i]:表示第i个坐标的紧相邻的上一个坐标,倒着来一直到0即可。
那么怎么把坐标存到一维数组里面呢(可以使用二位数组哈),比如坐标(i,j),那么讲5 * i + j存储到数组中就可表示坐标了,到时候取出的时候(x)只要x/5,x%5分别就是横纵坐标呢~
注意事项:
参考代码:
#include <iostream>
#include <queue>
using namespace std;
int a[10][10]; // 迷宫+标记数组
int pre[30]; // 记录路径
int nxt[4][2] = {1, 0, -1, 0, 0, 1, 0, -1}; // 辅助数组
void show(int n) {
if (!pre[n]) {
cout << "(0, 0)" << endl;
return;
}
show(pre[n]);
cout << "(" << pre[n] / 5 << ", " << pre[n] % 5 << ")" << endl;
}
void bfs() {
queue<pair<int, int> > q;
q.push(make_pair(0, 0));
a[0][0] = -1;
while (!q.empty()) {
int now_x = q.front().first, now_y = q.front().second;
for (int i = 0; i < 4; ++i) {
int new_x = now_x + nxt[i][0], new_y = now_y + nxt[i][1];
if (new_x < 0 || new_x > 4 || new_y < 0 || new_y > 4) continue;
if (a[new_x][new_y]) continue;
pre[5 * new_x + new_y] = 5 * now_x + now_y;
if (new_x == 4 && new_y == 4) {
show(24);
return;
}
q.push(make_pair(new_x, new_y));
a[new_x][new_y] = -1;
}
q.pop();
}
}
int main() {
for (int i = 0; i < 5; ++i)
for (int j = 0; j < 5; cin >> a[i][j++]);
bfs();
cout << "(4, 4)" << endl;
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复