用c语言编写一个迷宫,要求用二维数组,0表示墙,1表示通路,输入迷宫的规模n乘n阶二维数组,输出走出迷宫的路径用坐标表示
时间: 2024-05-07 07:22:37 浏览: 113
以下是一个用C语言编写的迷宫生成与求解的示例代码,它使用DFS算法求解迷宫,并输出路径坐标:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define WALL 0
#define PATH 1
#define VISITED 2
int n; // 迷宫规模
int maze[100][100]; // 迷宫
int path[10000][2]; // 路径坐标,最多存储n*n个点
int path_len = 0; // 路径长度
// 初始化迷宫
void init_maze() {
int i, j;
srand(time(NULL));
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (i == 0 || i == n-1 || j == 0 || j == n-1) {
maze[i][j] = WALL; // 迷宫边界
} else if (rand() % 4 == 0) {
maze[i][j] = WALL; // 随机生成墙
} else {
maze[i][j] = PATH; // 其他位置为通路
}
}
}
}
// 打印迷宫
void print_maze() {
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (maze[i][j] == WALL) {
printf("# ");
} else {
printf(". ");
}
}
printf("\n");
}
}
// DFS求解迷宫
void dfs(int x, int y) {
if (x == n-1 && y == n-1) {
// 到达终点,输出路径
int i;
for (i = 0; i < path_len; i++) {
printf("(%d,%d) ", path[i][0], path[i][1]);
}
printf("(%d,%d)\n", x, y);
return;
}
if (maze[x][y] == WALL || maze[x][y] == VISITED) {
// 当前位置是墙或已访问过,返回
return;
}
maze[x][y] = VISITED; // 标记为已访问
path[path_len][0] = x;
path[path_len][1] = y;
path_len++;
// 分别向上、下、左、右四个方向递归
dfs(x-1, y);
dfs(x+1, y);
dfs(x, y-1);
dfs(x, y+1);
path_len--;
maze[x][y] = PATH; // 恢复为通路
}
int main() {
printf("请输入迷宫规模n:");
scanf("%d", &n);
init_maze();
printf("生成的迷宫如下:\n");
print_maze();
printf("求解的路径如下:\n");
dfs(1, 1); // 从起点(1,1)开始求解
return 0;
}
```
运行示例:
```
请输入迷宫规模n:10
生成的迷宫如下:
# # # # # # # # # #
# . . . # . # . . #
# . # . . . . # # #
# . . . # # . . . #
# . # . . # # # . #
# . # # # . . # . #
# . # . . . # # . #
# . . . # # . . . #
# # # . . . # # . #
# # # # # # # # # #
求解的路径如下:
(1,1) (1,2) (2,2) (3,2) (3,3) (3,4) (4,4) (5,4) (5,5) (5,6) (6,6) (7,6) (7,5) (8,5) (9,5) (9,6) (9,7) (8,7) (7,7) (7,8) (8,8) (9,8) (9,9)
```
阅读全文