`
yuxingfirst
  • 浏览: 51707 次
  • 性别: Icon_minigender_1
  • 来自: 湘潭
社区版块
存档分类
最新评论

自己写的链栈实现的迷宫算法,发帖纪念下...

阅读更多
#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;
}
分享到:
评论
1 楼 yuxingfirst 2010-10-01  
补充:上面程序中的“//是在给maze分配内存的时候有点点问题”这个注释是多余的,因为在
发帖是LZ已经修正了所有的错误!!!

相关推荐

    链栈实现 走迷宫问题 MFC演示程序

    在压缩包中,除了MFC相关库文件,还包括了“数据结构报告—老鼠迷宫.docx”,这是一份详细的实验报告,涵盖了迷宫问题的理论背景、算法设计、代码实现和实验结果分析。而“MiceMaze”很可能是实现迷宫问题的源代码...

    迷宫算法Java程序设计.zip

    使用随机Prim算法生成迷宫,Prim随机算法不是优先选择最近选中的单元格,而是随机的从所有的列表中的单元格进行选择,新加入的单元格和旧加入的单元格同样概率会被选择,新加入的单元格没有优先权。因此其分支更多,...

    数据结构实验报告--链栈编写迷宫.doc

    数据结构实验报告--链栈编写迷宫.doc

    VC/c++平台队列实现迷宫算法

    本主题将深入探讨如何在VC/C++环境中利用队列数据结构来实现迷宫算法。队列是一种先进先出(FIFO)的数据结构,非常适合解决这类问题。 首先,我们需要理解迷宫的基本构造。一个迷宫可以表示为一个二维网格,其中每...

    数据结构课程设计迷宫算法的实现_JAVA.doc

    数据结构课程设计迷宫算法的实现_JAVA.doc是一份数据结构课程设计相关的文档,主要介绍了迷宫算法的实现,包括递归算法、使用栈作为辅助结构、使用队列作为辅助结构三种方法,并使用JAVA语言实现图形用户界面。...

    c语言实现的迷宫算法

    本文将详细解析用C语言实现的迷宫算法,通过深入理解其核心思想,帮助读者掌握此类算法的基本原理和实现技巧。 首先,我们要了解迷宫算法的基本概念。迷宫可以被抽象为一个二维网格,其中每个节点代表一个位置,...

    【H5JS】游戏常用算法-路径搜索算法-随机迷宫算法(普里姆算法).pdf

    在现代游戏开发领域中,路径搜索算法和随机迷宫算法的运用对于提升游戏体验至关重要。作为游戏开发者,掌握和熟练运用这些算法,能够为玩家带来更为丰富和有趣的互动体验。特别是对于角色扮演游戏(RPG)和策略游戏...

    C#实现迷宫算法(使用堆栈)

    在本文中,我们将深入探讨如何使用C#编程语言实现迷宫算法,并重点讲解利用堆栈数据结构来解决这一问题。迷宫算法是一个经典的路径搜索问题,通常用于游戏开发、路径规划和其他需要找到从起点到终点最短路径的应用...

    基于Python实现的迷宫求解小游戏.zip

    基于Python实现的迷宫求解小游戏.zip 这是95分以上高分必过课程设计项目,下载即用无需修改,确保可以运行。也可作为期末大作业。 基于Python实现的迷宫求解小游戏.zip 这是95分以上高分必过课程设计项目,下载即...

    数据结构课程设计迷宫算法的实现-JAVA.doc

    数据结构课程设计迷宫算法的实现-JAVA 数据结构课程设计迷宫算法的实现是使用 JAVA 语言编写的,旨在设计一个迷宫算法的实现,提供图形用户界面来展示迷宫的大小、入口及出口位置和初始状态等,并演示走迷宫的过程...

    VC 解析迷宫算法的一个例子源代码.rar

    这个源码实例主要位于压缩包内的"Maze"目录下,同时也包含其他相关程序源码,帮助读者全面理解迷宫算法的实现过程。 迷宫算法的核心在于如何生成和解决复杂路径问题。在VC++环境下,开发者通常会选择一种或多种经典...

    利用C语言实现迷宫算法。 利用随机函数生成迷宫,并显示所有路径.zip

    虽然标签提及了"JAVA",但实际内容是关于C语言的实现,因此我们将主要讨论C语言下的迷宫算法。 **迷宫生成算法** 1. **深度优先搜索(DFS, Depth-First Search)**:DFS 是一种递归策略,从起点开始,沿着一条路径...

    迷宫机器人走迷宫算法仿真设计.pdf

    改进后的算法提高了搜索效率,保证了迷宫搜索的时效性和稳定性,并且算法简单易实现,避免了一般算法冗长复杂的问题。通过数学建模和分析,将该算法应用于实际迷宫机器人实验平台,验证了其可行性和时效性。 在迷宫...

    C#实现4种经典迷宫生成算法和迷宫寻路算法

    本项目涉及的是使用C#语言实现的4种经典迷宫生成算法和A*寻路算法。以下是对这些算法的详细解释: 1. **并查集算法生成迷宫**: 并查集是一种数据结构,用于处理一些不相交集合的合并与查询。在迷宫生成中,可以将...

    作品:《最短迷宫寻路算法的演示》.rar

    - **迷宫生成**:迷宫的生成通常是通过某种随机算法实现的,如Prim's或Kruskal's算法用于生成连通图,然后将其转换为迷宫。此外,还可以使用分形理论或细胞自动机来创建更复杂的迷宫结构。 - **状态空间**:在迷宫...

    堆栈实现迷宫算法

    堆栈+数据结构 实现迷宫模拟算法

    迷宫求解 java语言实现.docx

    迷宫求解Java语言实现 在计算机科学中,迷宫求解是指使用算法和数据结构来解决迷宫问题的过程。迷宫问题是指在一个迷宫中,从起点到终点的最短路径问题。今天,我们将讨论使用Java语言来实现迷宫求解的方法。 问题...

    破解迷宫算法(需要预先下载随即迷宫生成算法)

    下载该资源前请确认已下载前置资源(随机迷宫生成算法),使用时先使用随即迷宫生成算法生成迷宫.txt文件,再将该文件复制到破解迷宫算法C文件同目录下才可使用。请确保头文件中的raw值和column值与随机迷宫生成算法...

    迷宫游戏的Java实现及基于蚁群算法在寻找迷宫路径上的探究.pptx

    迷宫游戏的Java实现及基于蚁群算法在寻找迷宫路径上的探究 该资源主要介绍了迷宫游戏的Java实现及基于蚁群算法在寻找迷宫路径上的探究。下面是该资源的知识点总结: 1. 迷宫游戏的Java实现: * 迷宫地图的设计:...

Global site tag (gtag.js) - Google Analytics