给定一个M×N的迷宫图、入口与出口、行走规则。求一条从指定入口到 出口的路径。所求路径必须是简单路径,即路径不重复。使用栈的结构完成。要求用c语言
时间: 2024-03-28 13:41:28 浏览: 168
好的,我会尽力回答你的问题。这是一个经典的迷宫问题,需要使用深度优先搜索算法来解决。下面是实现的代码示例:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_MAZE_SIZE 20
// 迷宫结构体
typedef struct {
int row, col; // 迷宫的行数和列数
int entrance_row, entrance_col; // 入口的行数和列数
int exit_row, exit_col; // 出口的行数和列数
int maze[MAX_MAZE_SIZE][MAX_MAZE_SIZE]; // 迷宫矩阵
} Maze;
// 方向向量(上、右、下、左)
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
// 栈结构体
typedef struct {
int row, col;
} Point;
Point stack[MAX_MAZE_SIZE * MAX_MAZE_SIZE];
int top = -1;
// 判断点是否合法
bool is_valid_point(Maze* maze, int row, int col) {
if (row < 0 || row >= maze->row || col < 0 || col >= maze->col) {
return false;
}
if (maze->maze[row][col] == 1) {
return false;
}
return true;
}
// 深度优先搜索
bool dfs(Maze* maze, int row, int col) {
if (row == maze->exit_row && col == maze->exit_col) {
// 找到出口,输出路径
for (int i = 0; i <= top; i++) {
printf("(%d, %d) ", stack[i].row, stack[i].col);
}
printf("\n");
return true;
}
for (int i = 0; i < 4; i++) {
int new_row = row + dx[i];
int new_col = col + dy[i];
if (is_valid_point(maze, new_row, new_col)) {
stack[++top] = (Point){new_row, new_col}; // 入栈
maze->maze[new_row][new_col] = 1; // 标记已访问
if (dfs(maze, new_row, new_col)) {
return true; // 找到出口,直接返回true
}
maze->maze[new_row][new_col] = 0; // 恢复标记
top--; // 出栈
}
}
return false;
}
int main() {
Maze maze = {
10, 10, // 迷宫的行数和列数
0, 0, // 入口的行数和列数
9, 9, // 出口的行数和列数
{
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 0, 1, 0, 1, 1, 1, 1, 0},
{0, 1, 0, 1, 0, 1, 0, 0, 1, 0},
{0, 1, 1, 1, 0, 1, 0, 1, 1, 0},
{0, 1, 0, 0, 0, 1, 0, 1, 0, 0},
{0, 1, 1, 1, 0, 1, 1, 1, 1, 1},
{0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{1, 1, 0, 1, 0, 1, 1, 1, 1, 0},
{0, 1, 0, 1, 0, 1, 0, 0, 1, 0},
{0, 1, 1, 1, 0, 1, 0, 1, 0, 0},
}
};
stack[++top] = (Point){maze.entrance_row, maze.entrance_col}; // 初始位置入栈
maze.maze[maze.entrance_row][maze.entrance_col] = 1; // 标记已访问
dfs(&maze, maze.entrance_row, maze.entrance_col);
return 0;
}
```
以上代码实现了一个10x10的迷宫,入口在左上角,出口在右下角。迷宫矩阵中0表示可以通过的路径,1表示障碍物。程序会输出从入口到出口的所有路径。如果想让程序只输出其中一条路径,可以在找到出口后直接返回true,结束搜索。
阅读全文