14.求解迷宫问题 【问题描述】 以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论,用c语言来实现,并且通过在代码中添加读入数据的函数来达到输入数据的目的。
时间: 2023-12-07 19:05:29 浏览: 244
迷宫问题:m×n长方阵表示迷宫
5星 · 资源好评率100%
以下是求解迷宫问题的C语言代码,其中通过文件读取的方式获取迷宫地图数据。
```c
#include <stdio.h>
#include <stdbool.h>
#define ROWS 100
#define COLS 100
int maze[ROWS][COLS]; // 迷宫地图
bool visited[ROWS][COLS] = {false}; // 标记是否已经走过
int m, n; // 迷宫地图的行数和列数
int start_x, start_y, end_x, end_y; // 起点和终点的坐标
// 根据文件读取迷宫地图数据
void readMaze(char* fileName) {
FILE* fp = fopen(fileName, "r");
fscanf(fp, "%d %d", &m, &n);
fscanf(fp, "%d %d %d %d", &start_x, &start_y, &end_x, &end_y);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
fscanf(fp, "%d", &maze[i][j]);
}
}
fclose(fp);
}
// 判断当前位置是否合法
bool isValid(int x, int y) {
return x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == 0 && !visited[x][y];
}
// 深度优先搜索
bool dfs(int x, int y) {
visited[x][y] = true;
if (x == end_x && y == end_y) { // 到达终点
return true;
}
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
for (int i = 0; i < 4; i++) {
int new_x = x + dx[i];
int new_y = y + dy[i];
if (isValid(new_x, new_y)) {
if (dfs(new_x, new_y)) {
return true;
}
}
}
return false;
}
int main() {
char* fileName = "maze.txt";
readMaze(fileName);
bool hasPath = dfs(start_x, start_y);
if (hasPath) {
printf("迷宫有解!\n");
} else {
printf("迷宫无解!\n");
}
return 0;
}
```
假设输入的迷宫地图数据存储在`maze.txt`文件中,文件格式如下:
```
5 5
0 0 4 4
0 1 0 0 0
0 1 0 1 0
0 0 0 1 0
0 1 0 0 0
0 1 1 1 0
```
其中第一行为迷宫的行数和列数,第二行为起点和终点的坐标,其余行为迷宫地图数据。
运行程序后,会输出迷宫是否有解的结果。
阅读全文