原题链接:迷宫问题
参考代码:
#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复