C语言栈的迷宫求解讲解

简介: C语言栈的迷宫求解讲解

迷宫求解是一个经典的算法问题,通常使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。而栈是DFS的一个常用工具,因为栈是后进先出(LIFO)的数据结构,可以很好地模拟递归调用时的函数调用栈。

以下是一个使用栈来求解迷宫问题的C语言示例。在这个示例中,我们假设迷宫是一个二维数组,其中0表示可通过的空格,1表示墙壁或障碍物,2表示起点,3表示终点。

数据结构定义

首先,我们需要定义迷宫的数据结构以及栈的数据结构。

 

#include <stdio.h> 

 

#include <stdlib.h> 

 

#include <stdbool.h> 

 

 

 

#define MAX_SIZE 10

 

 

 

typedef struct {

 

int x;

 

int y;

 

} Position;

 

 

 

typedef struct {

 

Position pos;

 

int dir; // 0: 上, 1: 右, 2: 下, 3: 左

 

} StackNode;

 

 

 

typedef struct {

 

StackNode data[MAX_SIZE * MAX_SIZE];

 

int top;

 

} Stack;

 

 

 

int maze[MAX_SIZE][MAX_SIZE] = {

 

// 迷宫布局,0为空格,1为墙壁,2为起点,3为终点

 

// ...

 

};

 

 

 

int mazeSize = MAX_SIZE; // 迷宫的大小

栈的操作函数

接下来,我们实现栈的基本操作函数。

 

void initStack(Stack *s) {

 

s->top = -1;

 

}

 

 

 

bool isFull(Stack *s) {

 

return s->top == MAX_SIZE * MAX_SIZE - 1;

 

}

 

 

 

bool isEmpty(Stack *s) {

 

return s->top == -1;

 

}

 

 

 

bool push(Stack *s, Position pos, int dir) {

 

if (isFull(s)) {

 

return false;

 

}

 

s->data[++s->top].pos = pos;

 

s->data[s->top].dir = dir;

 

return true;

 

}

 

 

 

bool pop(Stack *s, Position *pos, int *dir) {

 

if (isEmpty(s)) {

 

return false;

 

}

 

*pos = s->data[s->top].pos;

 

*dir = s->data[s->top].dir;

 

s->top--;

 

return true;

 

}

迷宫求解函数

现在,我们实现迷宫求解函数,使用DFS和栈。

 

bool isValid(Position pos) {

 

return pos.x >= 0 && pos.x < mazeSize &&

 

pos.y >= 0 && pos.y < mazeSize &&

 

maze[pos.x][pos.y] == 0; // 空格可走

 

}

 

 

 

bool dfs(Stack *s, Position *endPos) {

 

Position currentPos, nextPos;

 

int dir;

 

 

 

if (pop(s, ¤tPos, &dir)) {

 

// 尝试四个方向

 

int dx[] = {-1, 0, 1, 0}; // 上, 右, 下, 左

 

int dy[] = {0, 1, 0, -1}; // 上, 右, 下, 左

 

 

 

for (int i = 0; i < 4; ++i) {

 

nextPos.x = currentPos.x + dx[i];

 

nextPos.y = currentPos.y + dy[i];

 

 

 

if (isValid(nextPos)) {

 

maze[nextPos.x][nextPos.y] = 1; // 标记为已访问

 

 

 

if (nextPos.x == endPos->x && nextPos.y == endPos->y) {

 

// 到达终点,打印路径或进行其他操作

 

// ...

 

return true;

 

} else {

 

push(s, nextPos, i); // 将下一步压入栈中

 

}

 

}

 

}

 

}

 

 

 

return false;

 

}

 

 

 

void solveMaze() {

 

Position startPos = { /* 起点坐标 */ };

 

Position endPos = { /* 终点坐标 */ };

 

Stack s;

 

initStack(&s);

 

 

 

maze[startPos.x][startPos.y] = 1; // 标记起点为已访问

 

push(&s, startPos, -1); // 将起点压入栈中,方向

 

目录
相关文章
|
6月前
|
C语言
链栈的初始化以及用C语言表示进栈、出栈和判断栈空
链栈的初始化以及用C语言表示进栈、出栈和判断栈空
59 3
|
6月前
|
机器学习/深度学习 存储 算法
C语言栈与递归的实现讲解
C语言栈与递归的实现讲解
97 0
|
6月前
|
C语言
C语言栈的行编辑程序讲解
C语言栈的行编辑程序讲解
110 0
|
6月前
|
C语言
C语言栈的括号匹配的检验讲解及相关代码
C语言栈的括号匹配的检验讲解及相关代码
141 0
|
1天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
29 9
|
25天前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
21 1
|
2月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
317 8
|
2月前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
306 3
|
5月前
|
C语言
C语言的栈帧
C语言的栈帧
|
5月前
|
C语言 C++
【数据结构】C语言实现:栈(Stack)与队列(Queue)
【数据结构】C语言实现:栈(Stack)与队列(Queue)