用c语言写出一个用链栈存储的m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍,迷宫的探索方向为8个方向。迷宫问题要求求出从入口(1,1)到出口(m,n)的一条通路,或得出没有通路的结论。
时间: 2023-09-16 13:16:02 浏览: 126
以下是一个使用链栈存储的m x n迷宫的示例代码,同样使用深度优先搜索算法(DFS)求解从入口到出口的一条通路。
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100
// 迷宫节点类型
typedef struct Node {
int x; // 节点所在行
int y; // 节点所在列
struct Node* next; // 指向下一个节点的指针
} Node;
// 栈类型
typedef struct Stack {
Node* top; // 栈顶指针
} Stack;
int maze[MAX_SIZE][MAX_SIZE]; // 迷宫
bool visited[MAX_SIZE][MAX_SIZE]; // 标记是否访问过
int m, n; // 迷宫的行数和列数
// 创建一个节点
Node* createNode(int x, int y) {
Node* node = (Node*)malloc(sizeof(Node));
node->x = x;
node->y = y;
node->next = NULL;
return node;
}
// 初始化栈
void initStack(Stack* s) {
s->top = NULL;
}
// 判断栈是否为空
bool isEmpty(Stack* s) {
return s->top == NULL;
}
// 入栈操作
void push(Stack* s, int x, int y) {
Node* node = createNode(x, y);
node->next = s->top;
s->top = node;
}
// 出栈操作
void pop(Stack* s) {
if (!isEmpty(s)) {
Node* node = s->top;
s->top = node->next;
free(node);
}
}
// 获取栈顶元素
Node* top(Stack* s) {
if (!isEmpty(s)) {
return s->top;
}
return NULL;
}
// 深度优先搜索函数
bool dfs() {
Stack s;
initStack(&s);
push(&s, 1, 1); // 入口节点入栈
while (!isEmpty(&s)) {
Node* node = top(&s);
int x = node->x;
int y = node->y;
pop(&s);
if (x < 1 || x > m || y < 1 || y > n) { // 超出边界
continue;
}
if (maze[x][y] == 1 || visited[x][y]) { // 障碍或已访问
continue;
}
if (x == m && y == n) { // 到达出口
return true;
}
visited[x][y] = true; // 标记为已访问
// 按照8个方向搜索
push(&s, x-1, y-1);
push(&s, x-1, y);
push(&s, x-1, y+1);
push(&s, x, y-1);
push(&s, x, y+1);
push(&s, x+1, y-1);
push(&s, x+1, y);
push(&s, x+1, y+1);
}
return false;
}
int main() {
// 读入迷宫的大小
printf("请输入迷宫的行数和列数(用空格分隔):");
scanf("%d %d", &m, &n);
// 读入迷宫的数据
printf("请输入迷宫的数据(0表示通路,1表示障碍):\n");
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
scanf("%d", &maze[i][j]);
}
}
// 搜索从入口到出口的通路
if (dfs()) {
printf("从入口到出口存在一条通路。\n");
} else {
printf("从入口到出口不存在通路。\n");
}
return 0;
}
```
同样需要注意的是,以上代码只是一个简单的实现,对于大规模的迷宫,可能会出现栈溢出等问题,请谨慎使用。
阅读全文