原题链接:迷宫问题
参考代码:
#include<stdio.h>
// 最大行列数
#define MAXRCS 100
#define MAXVAL 0xffff
int map[MAXRCS][MAXRCS]; // 用整型数组存放地图并可记录步数
// 起点终点坐标、行列数
int sx, sy, ex, ey, r, c;
// 四个方向移动
int xp[] = { 0, 1, 0, -1 };
int yp[] = { 1, 0, -1, 0 };
void DFS(int x, int y, int step) {
int i, nx, ny;
// 四个方向
for (i = 0; i < 4; i++) {
nx = x + xp[i];
ny = y + yp[i];
// 坐标在地图内 ----------------------- 下一步步数比原先路线少(为可通点)
if (nx >= 0 && nx < r && ny >= 0 && ny < c && step + 1 < map[nx][ny]) {
map[nx][ny] = step + 1;
DFS(nx, ny, step + 1);
}
}
}
int main() {
int i, j, t;
char ch;
scanf("%d", &t);
while (t--) {
// 初始化地图
scanf("%d%d", &r, &c);
getchar(); // 读取'\n'
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++) {
ch = getchar(); // 读取字符并转换,0不可通,MAXVAL为可通
switch (ch) {
case '-': { map[i][j] = MAXVAL; break; }
case '#': { map[i][j] = 0; break; }
case 'S': { map[i][j] = 0; sx = i; sy = j; break; }
case 'E': { map[i][j] = MAXVAL; ex = i; ey = j; }
}
}
getchar();
}
DFS(sx, sy, 0); // map[ex][ey]值改动,说明有可达路径
printf("%d\n", map[ex][ey] != MAXVAL ? map[ex][ey] : -1);
}
return 0;
}示意图:(红色表压栈)
原地图:---------> 转换后:----------> 一次深搜后:-----> 回溯,只走步数更少的路线:
| S | - | - | 0 | ∞ | ∞ | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 1 | 2 | ||||
| - | # | - | → | ∞ | 0 | ∞ | → | 7 | 0 | 3 | → | 7 | 0 | 3 | → | 1 | 0 | 3 |
| - | - | E | ∞ | ∞ | ∞ | 6 | 5 | 4 | 6 | 5 | 4 | 2 | 3 | 4 |
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复