#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
int m,n;
int **maze = NULL; //表示迷宫
struct Element{ //这里就是定义节点
int i;
int j;
int di;
};
typedef struct LinkStack { //这里就是定义链栈...
struct Element element;
struct LinkStack * next;
struct LinkStack * prior;
}LinkStack;
LinkStack *top = NULL; //栈顶指针,因为是链栈,所以栈顶指针要是一个指针变量
LinkStack *head = NULL; //链栈的头指针
int count=1; //路径计数
void printMaze(int ** maze) //输出迷宫
{
int i,j;
printf("您确定的迷宫图如下所示:\n");
for(i=0; i<m+2; i++) {
for(j=0; j<n+2; j++) {
printf("%4d",maze[i][j]);
}
printf("\n");
}
}
void addWall(int ** maze) //给迷宫加墙
{
int i,j;
for(i=0; i<m+2; i++)
{
for(j=0; j<n+2; j++) {
if(i==0){
maze[i][j] = 1;
}
if(i>0 && i<(m+2-1)) {
maze[i][0]=1;
maze[i][n+2-1]=1;
break;
}
if(i==m+2-1) {
maze[i][j]=1;
}
}
}
}
int ** initMaze() { //对迷宫进行初始化的函数
int i,j;
int flag = 0;
printf("请输入迷宫的行数 m=");
scanf("%d",&m);
printf("请输入迷宫的列数 n=");
scanf("%d",&n);
//是在给maze分配内存的时候有点点问题
maze = (int **)malloc(sizeof(int *) * (m+2)); //开辟迷宫的存储空间
for(i=0; i<n+2; i++)
{
*(maze+i) = (int *)malloc(sizeof(int)*(n+2));
}
addWall(maze); //给迷宫加墙
printf("\n请输入迷宫的各行各列(注意:最后一个数需要是0):\n用空格隔开,0代表路,1代表墙\n"); //保证出口是路,所以最后一个数要是0
for(i=1;i<=m;i++) {
for(j=1;j<=n;j++) {
scanf("%d",&maze[i][j]);
}
}
printf("你输完了\n");
printMaze(maze); //输出迷宫图
return maze;
}
void mazePath() {
if(top == head && head != NULL) //终止递归的条件
{
return;
}
int k = 0;
int find = 0;
int i = 0,j=0;
int di = -1;
if(top != NULL)di=top->element.di; //di一开始就保存当前栈顶指针所指的节点的方向
LinkStack *node= (LinkStack *) malloc(sizeof(LinkStack)); //每一次递归都首先开辟节点(因为要查找元素,所以要先开辟节点)
node->element.di = di;
if(top == NULL)
{
head = (LinkStack *) malloc(sizeof(LinkStack)); //链表的头指针
head->element.i = 1;
head->element.j = 0;
head->element.di = 1;
head->prior = NULL;
top = head;
node->element.i = 1;
node->element.j = 1;
node->element.di = -1;
}
top->next = node;
node->next = NULL;
node->prior = top;
top = node;
di = top->element.di;//取得当前栈顶指针所指的元素的方向
while(di<4 && find == 0)
{
di++;
switch(di)
{
case 0: i = top->prior->element.i - 1;j = top->prior->element.j;break;
case 1: i = top->prior->element.i;j = top->prior->element.j + 1;break;
case 2: i = top->prior->element.i + 1;j = top->prior->element.j;break;
case 3: i = top->prior->element.i;j = top->prior->element.j - 1;break;
}
if(maze[i][j] == 0)find = 1;
}
if(i == m && j == n)
{
top->element.i = m;
top->element.j = n;
top->prior->element.di = di;
printf("%4d:",count++);
LinkStack * n = head->next;
while(n != NULL)
{
printf("(%d,%d) ",n->element.i,n->element.j); //找到出口,输出路径
if((k + 1)%5 == 0)
{
printf("\n\t");
}
k++;
n = n->next;
}
printf("\n");
maze[top->element.i][top->element.j] = 0;
top = top->prior; //退栈
free(node);
mazePath();
}else {
if(find == 1)
{
top->prior->element.di = di;//退栈时,当找到下一个可走的节点后必须对当前节点的方向进行了更新
top->element.i = i;
top->element.j = j;
top->element.di = -1;
maze[i][j] = -1; //避免重复走到该点
mazePath();
}
else
{
maze[top->prior->element.i][top->prior->element.j] = 0;//让它成为下条路径的可走路径
top = top->prior->prior; //退栈
free(node);
mazePath();
}
}
}
void main() {
int i,j;
initMaze();
printf("您确定的迷宫图如下所示:\n");
printf("迷宫所有路径如下:\n");
mazePath();
if(maze != NULL) //释放开辟的所有内存空间
{
for(i=0;i<m+2;i++) //因为maze是二级指针,所以在释放maze所指的内存空间时,要先释放maze上的一级指针
{
free(maze[i]);
}
free(maze);
}
if(head != NULL) //释放内存
{
free(head);
}
return;
}
分享到:
相关推荐
在压缩包中,除了MFC相关库文件,还包括了“数据结构报告—老鼠迷宫.docx”,这是一份详细的实验报告,涵盖了迷宫问题的理论背景、算法设计、代码实现和实验结果分析。而“MiceMaze”很可能是实现迷宫问题的源代码...
使用随机Prim算法生成迷宫,Prim随机算法不是优先选择最近选中的单元格,而是随机的从所有的列表中的单元格进行选择,新加入的单元格和旧加入的单元格同样概率会被选择,新加入的单元格没有优先权。因此其分支更多,...
数据结构实验报告--链栈编写迷宫.doc
本主题将深入探讨如何在VC/C++环境中利用队列数据结构来实现迷宫算法。队列是一种先进先出(FIFO)的数据结构,非常适合解决这类问题。 首先,我们需要理解迷宫的基本构造。一个迷宫可以表示为一个二维网格,其中每...
数据结构课程设计迷宫算法的实现_JAVA.doc是一份数据结构课程设计相关的文档,主要介绍了迷宫算法的实现,包括递归算法、使用栈作为辅助结构、使用队列作为辅助结构三种方法,并使用JAVA语言实现图形用户界面。...
本文将详细解析用C语言实现的迷宫算法,通过深入理解其核心思想,帮助读者掌握此类算法的基本原理和实现技巧。 首先,我们要了解迷宫算法的基本概念。迷宫可以被抽象为一个二维网格,其中每个节点代表一个位置,...
在现代游戏开发领域中,路径搜索算法和随机迷宫算法的运用对于提升游戏体验至关重要。作为游戏开发者,掌握和熟练运用这些算法,能够为玩家带来更为丰富和有趣的互动体验。特别是对于角色扮演游戏(RPG)和策略游戏...
在本文中,我们将深入探讨如何使用C#编程语言实现迷宫算法,并重点讲解利用堆栈数据结构来解决这一问题。迷宫算法是一个经典的路径搜索问题,通常用于游戏开发、路径规划和其他需要找到从起点到终点最短路径的应用...
基于Python实现的迷宫求解小游戏.zip 这是95分以上高分必过课程设计项目,下载即用无需修改,确保可以运行。也可作为期末大作业。 基于Python实现的迷宫求解小游戏.zip 这是95分以上高分必过课程设计项目,下载即...
数据结构课程设计迷宫算法的实现-JAVA 数据结构课程设计迷宫算法的实现是使用 JAVA 语言编写的,旨在设计一个迷宫算法的实现,提供图形用户界面来展示迷宫的大小、入口及出口位置和初始状态等,并演示走迷宫的过程...
这个源码实例主要位于压缩包内的"Maze"目录下,同时也包含其他相关程序源码,帮助读者全面理解迷宫算法的实现过程。 迷宫算法的核心在于如何生成和解决复杂路径问题。在VC++环境下,开发者通常会选择一种或多种经典...
虽然标签提及了"JAVA",但实际内容是关于C语言的实现,因此我们将主要讨论C语言下的迷宫算法。 **迷宫生成算法** 1. **深度优先搜索(DFS, Depth-First Search)**:DFS 是一种递归策略,从起点开始,沿着一条路径...
改进后的算法提高了搜索效率,保证了迷宫搜索的时效性和稳定性,并且算法简单易实现,避免了一般算法冗长复杂的问题。通过数学建模和分析,将该算法应用于实际迷宫机器人实验平台,验证了其可行性和时效性。 在迷宫...
本项目涉及的是使用C#语言实现的4种经典迷宫生成算法和A*寻路算法。以下是对这些算法的详细解释: 1. **并查集算法生成迷宫**: 并查集是一种数据结构,用于处理一些不相交集合的合并与查询。在迷宫生成中,可以将...
- **迷宫生成**:迷宫的生成通常是通过某种随机算法实现的,如Prim's或Kruskal's算法用于生成连通图,然后将其转换为迷宫。此外,还可以使用分形理论或细胞自动机来创建更复杂的迷宫结构。 - **状态空间**:在迷宫...
堆栈+数据结构 实现迷宫模拟算法
迷宫求解Java语言实现 在计算机科学中,迷宫求解是指使用算法和数据结构来解决迷宫问题的过程。迷宫问题是指在一个迷宫中,从起点到终点的最短路径问题。今天,我们将讨论使用Java语言来实现迷宫求解的方法。 问题...
下载该资源前请确认已下载前置资源(随机迷宫生成算法),使用时先使用随即迷宫生成算法生成迷宫.txt文件,再将该文件复制到破解迷宫算法C文件同目录下才可使用。请确保头文件中的raw值和column值与随机迷宫生成算法...
迷宫游戏的Java实现及基于蚁群算法在寻找迷宫路径上的探究 该资源主要介绍了迷宫游戏的Java实现及基于蚁群算法在寻找迷宫路径上的探究。下面是该资源的知识点总结: 1. 迷宫游戏的Java实现: * 迷宫地图的设计:...