用c语言编写一个迷宫,要求手动输入一个足够大的迷宫,进口在左上角,出口为右下上角,由0和1组成,0表示通路, 1表示墙,输出U,L,R,D表示路径,无通路输出NO PASS
时间: 2023-10-03 16:02:47 浏览: 99
迷宫问题--用C语言编写
4星 · 用户满意度95%
以下是一个使用C语言编写的迷宫求解程序。首先,我们需要手动输入迷宫的大小和内容,然后使用深度优先搜索算法(DFS)来寻找从起点到终点的路径。搜索过程中,我们需要记录当前路径,如果遇到终点,则输出路径,否则返回上一步继续搜索。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 // 最大迷宫大小
int maze[MAX_SIZE][MAX_SIZE]; // 迷宫矩阵
int visited[MAX_SIZE][MAX_SIZE]; // 标记矩阵,记录是否访问过
int path[MAX_SIZE * MAX_SIZE][2]; // 路径矩阵,记录路径
int top = -1; // 路径栈顶指针
// 坐标结构体
typedef struct {
int x;
int y;
} Point;
// 栈结构体
typedef struct {
Point data[MAX_SIZE * MAX_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack *s) {
return s->top == -1;
}
// 入栈
void push(Stack *s, Point p) {
s->data[++(s->top)] = p;
}
// 出栈
Point pop(Stack *s) {
return s->data[(s->top)--];
}
// 获取栈顶元素
Point topStack(Stack *s) {
return s->data[s->top];
}
// DFS搜索
int dfs(int x, int y, int m, int n) {
Point p = {x, y};
visited[x][y] = 1; // 标记已访问
push(&path[top+1], p); // 将当前点加入路径
top++; // 路径栈顶指针加1
if (x == m && y == n) { // 如果到达终点
for (int i = 0; i <= top; i++) {
Point p = path[i];
if (i == 0) printf("U"); // 起点
else if (p.x == path[i-1].x && p.y == path[i-1].y+1) printf("R"); // 向右
else if (p.x == path[i-1].x && p.y == path[i-1].y-1) printf("L"); // 向左
else if (p.x == path[i-1].x+1 && p.y == path[i-1].y) printf("D"); // 向下
else if (p.x == path[i-1].x-1 && p.y == path[i-1].y) printf("U"); // 向上
}
return 1; // 返回1表示找到路径
}
// 搜索四个方向
if (y+1 <= n && maze[x][y+1] == 0 && !visited[x][y+1]) {
if (dfs(x, y+1, m, n)) return 1;
}
if (x+1 <= m && maze[x+1][y] == 0 && !visited[x+1][y]) {
if (dfs(x+1, y, m, n)) return 1;
}
if (y-1 >= 0 && maze[x][y-1] == 0 && !visited[x][y-1]) {
if (dfs(x, y-1, m, n)) return 1;
}
if (x-1 >= 0 && maze[x-1][y] == 0 && !visited[x-1][y]) {
if (dfs(x-1, y, m, n)) return 1;
}
// 没有找到路径,回溯
pop(&path[top]);
top--;
return 0;
}
int main() {
int m, n; // 迷宫大小
printf("请输入迷宫大小(行 列):\n");
scanf("%d %d", &m, &n);
printf("请输入迷宫矩阵(0表示通路,1表示墙):\n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &maze[i][j]);
visited[i][j] = 0; // 初始化标记矩阵
}
}
if (dfs(0, 0, m-1, n-1) == 0) printf("NO PASS\n"); // 没有找到路径
return 0;
}
```
使用示例:
```
请输入迷宫大小(行 列):
5 5
请输入迷宫矩阵(0表示通路,1表示墙):
0 1 0 0 0
0 1 0 1 0
0 0 0 1 0
1 1 1 0 0
0 0 0 1 0
ULURDDRR
```
该迷宫的矩阵如下:
```
0 1 0 0 0
0 1 0 1 0
0 0 0 1 0
1 1 1 0 0
0 0 0 1 0
```
起点为左上角,终点为右下角,路径为`ULURDDRR`。
阅读全文