C语言首行为两个数字h、w,分别表示迷宫的高度与宽度,0≤h、w≤13; 之后h行,每行包含w个字符,其中: #表示迷宫墙壁; (空格)表示迷宫通路; $表示起点(有且只有一个); &表示终点(有且只有一个) 输出格式要求: 程序需要输出h行,每行w个字符,其中: #表示迷宫墙壁; (空格)表示迷宫通路; $表示起点(有且只有一个); &表示终点(有且只有一个) *表示路径(不含起点与终点)求解迷宫的所有路径和最短路径并打印
时间: 2023-12-06 21:42:54 浏览: 79
基于栈的C语言迷宫问题与实现.docx
5星 · 资源好评率100%
这道题需要用到回溯算法进行求解。首先我们需要将输入的迷宫保存在一个二维字符数组中,然后从起点开始进行深度优先搜索(DFS),每次搜索将当前位置标记为已访问,然后依次尝试向上、下、左、右四个方向移动,如果能够移动到一个未访问过的位置,则继续向该位置进行搜索。当搜索到终点时,记录下当前路径,并比较该路径与当前最短路径的长度,如果比当前最短路径短,则更新最短路径。
最后将所有路径和最短路径打印出来即可。以下是具体实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_H 13
#define MAX_W 13
char maze[MAX_H][MAX_W + 1]; // 迷宫数组
int visited[MAX_H][MAX_W]; // 标记数组,记录每个位置是否被访问过
int start_x, start_y; // 起点坐标
int end_x, end_y; // 终点坐标
int path_cnt = 0; // 路径总数
int min_path_len = -1; // 最短路径长度
// DFS 搜索迷宫
void dfs(int x, int y, int path_len, char path[MAX_H * MAX_W + 1]) {
// 边界检查
if (x < 0 || x >= MAX_H || y < 0 || y >= MAX_W) {
return;
}
// 检查是否到达终点
if (x == end_x && y == end_y) {
if (min_path_len == -1 || path_len < min_path_len) {
// 更新最短路径
min_path_len = path_len;
printf("Shortest path: %s\n", path);
}
// 记录路径总数
path_cnt++;
return;
}
// 检查当前位置是否为墙壁或已访问过
if (maze[x][y] == '#' || visited[x][y]) {
return;
}
// 标记当前位置为已访问
visited[x][y] = 1;
// 将当前位置加入路径
path[path_len] = maze[x][y];
path[path_len + 1] = '\0';
// 向四个方向继续搜索
dfs(x - 1, y, path_len + 1, path);
dfs(x + 1, y, path_len + 1, path);
dfs(x, y - 1, path_len + 1, path);
dfs(x, y + 1, path_len + 1, path);
// 恢复当前位置的状态
visited[x][y] = 0;
path[path_len] = '\0';
}
int main() {
int h, w;
scanf("%d %d", &h, &w);
for (int i = 0; i < h; i++) {
scanf("%s", maze[i]);
for (int j = 0; j < w; j++) {
if (maze[i][j] == '$') {
start_x = i;
start_y = j;
}
if (maze[i][j] == '&') {
end_x = i;
end_y = j;
}
}
}
// 初始化标记数组
memset(visited, 0, sizeof(visited));
// 开始搜索
char path[MAX_H * MAX_W + 1];
dfs(start_x, start_y, 0, path);
// 打印路径总数和最短路径长度
printf("Total paths: %d\n", path_cnt);
printf("Min path length: %d\n", min_path_len);
return 0;
}
```
阅读全文