迷宫问题 问题描述:给定一个迷宫,求出所有从入口到出口的路径,具体要求如下: 迷宫以16*16的矩阵存储在本地文本文件中,格式自定义。 迷宫中的障碍物要占到一定比例。 必须使用非递归的形式求解。 必须绘制出迷宫和求解的路径(命令行或GUI均可,可以只输出其中一条)。 当无解时能提示相应信息。 必须使用C语言
时间: 2024-03-10 18:47:42 浏览: 128
这是一个比较典型的迷宫求解问题,下面是一个简单的C语言程序来解决这个问题:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define ROWS 16
#define COLS 16
// 定义迷宫结构体
typedef struct {
int x;
int y;
} Point;
typedef struct {
int maze[ROWS][COLS];
Point start;
Point end;
} Maze;
// 初始化迷宫
void init(Maze *maze) {
int i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (rand() % 5 == 0) {
maze->maze[i][j] = 0; // 障碍物
} else {
maze->maze[i][j] = 1; // 空地
}
}
}
maze->start.x = rand() % ROWS;
maze->start.y = rand() % COLS;
maze->maze[maze->start.x][maze->start.y] = 1;
maze->end.x = rand() % ROWS;
maze->end.y = rand() % COLS;
maze->maze[maze->end.x][maze->end.y] = 1;
}
// 绘制迷宫
void draw(Maze *maze) {
int i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (maze->maze[i][j] == 0) {
printf("X ");
} else if (maze->start.x == i && maze->start.y == j) {
printf("S ");
} else if (maze->end.x == i && maze->end.y == j) {
printf("E ");
} else {
printf(". ");
}
}
printf("\n");
}
}
// 判断一个点是否在迷宫内
bool isInside(Maze *maze, Point *p) {
return p->x >= 0 && p->x < ROWS && p->y >= 0 && p->y < COLS;
}
// 判断一个点是否为通路
bool isPath(Maze *maze, Point *p) {
return isInside(maze, p) && maze->maze[p->x][p->y] == 1;
}
// 搜索迷宫
bool search(Maze *maze) {
Point stack[ROWS * COLS]; // 定义栈
int top = 0; // 栈顶指针
Point cur = maze->start;
do {
// 将当前点入栈,并标记为已经访问
maze->maze[cur.x][cur.y] = 2;
stack[top++] = cur;
// 判断当前点是否为终点
if (cur.x == maze->end.x && cur.y == maze->end.y) {
return true;
}
// 搜索四周的点
Point next;
next.x = cur.x - 1;
next.y = cur.y;
if (isPath(maze, &next)) {
cur = next;
continue;
}
next.x = cur.x;
next.y = cur.y + 1;
if (isPath(maze, &next)) {
cur = next;
continue;
}
next.x = cur.x + 1;
next.y = cur.y;
if (isPath(maze, &next)) {
cur = next;
continue;
}
next.x = cur.x;
next.y = cur.y - 1;
if (isPath(maze, &next)) {
cur = next;
continue;
}
// 如果四周都走不通,就回溯到上一个点
top--;
if (top <= 0) {
return false;
}
cur = stack[top - 1];
} while (true);
}
int main() {
Maze maze;
init(&maze);
draw(&maze);
if (search(&maze)) {
printf("Found a path.\n");
} else {
printf("No path found.\n");
}
return 0;
}
```
这个程序首先定义了一个迷宫结构体,包含了迷宫的矩阵、起点和终点坐标。然后,使用 init() 函数初始化迷宫,使用 draw() 函数绘制迷宫。接着,使用 search() 函数搜索迷宫,如果找到一条通路,就返回 true;否则,返回 false。
在 search() 函数中,我们使用了一个栈来保存已经访问过的点。每次访问一个点时,如果它是通路,就将它入栈,并标记为已经访问。然后,我们尝试搜索四周的点,如果有通路,就继续前进;否则,就回溯到上一个点,继续搜索其他方向。如果回溯到栈底仍然没有找到通路,就返回 false。
这个程序只能找到一条通路,并不能找到所有的通路。如果你需要找到所有通路,可以使用回溯算法。
阅读全文