数据结构 迷宫问题,数据结构迷宫求解课程设计
假设在一个四行四列的二维数组中,1为墙,0为通道,我们要怎样找到出口
0行0列为入口,右下角为出口,最后还要打印他的坐标,那我们应该怎么做?
分析:可以采用深度优先算法
1、判断当前位置的上下左右是否有为0的数,为0就走,为一就不走
2、有个前提就是要判断这个坐标是否有效
3、当走错了,是不是要回到上下左右任意位置有为0的地方,但是假设上下左右都有为0的通路,那我们怎么知道那个路是我们走过的哪个是没走过的,使用就要进行标记,怎么标记,可以随便给他重新赋值
4、打印坐标,假设已经找到出口了,那我们打印坐标是不是要反着打印,那是不是就可以采用栈,栈的特性就是后进先出,先把坐标入栈,当遇到死胡同返回到某一位置时是不是就依次把错误的坐标出栈,最后再创建一个栈,把老栈里的坐标倒到新栈,是不是就可以把坐标从后往前打印
好了具体的分析完毕,再补充一个知识点
代码有点小长,上代码
#define _CRT_SECURE_NO_WARNINGS
#包含标准视频
#包含标准库
#include assert.h
#包含标准布尔
数据类型说明结构路径
{
(同Internationalorganizations)国际组织行;
内部列
}拍拍;
/*///////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
typedef PAT标准数据类型
数据类型说明结构堆栈
{
stdata类型* a;
int top//指向栈顶就是大小
(同Internationalorganizations)国际组织容量;//容量
} ST
void堆栈初始化(ST * PS);//初始化
无效堆叠打印(const ST * PS);//打印
void StackPush(ST* ps,stdata type x);//入栈
无效堆栈销毁(ST * PS);//销毁
空的堆栈弹出(ST * PS);//出栈
stdata类型栈顶(const ST * PS);//取栈顶
int堆栈大小(const ST * PS);//计算栈的元素
//bool StackEmpty(const ST* ps,int * size);
bool StackEmpty(const ST * PS);//判断栈是否为空
无效堆栈单位(ST* ps)
{
assert(PS);
PS-a=NULL;
ps-容量=0;
PS-top=0;//也可以给-1
}
//void StackPrint(const ST* ps)
//{
//assert(PS);
//int I;
//for(I=PS-top-1;我我-)
//{
//printf(%d ,PS-a[I]);
//}
//printf( \ n );
//}
无效新堆栈(ST* ps)
{
int newcapacity=ps- capacity==0?4 : ps-容量* 2;
ST* newStack=realloc(ps- a,sizeof(ST)*新容量);
if (newStack==NULL)
{
printf(开辟内存失败);
退出(-1);
}
PS-a=新堆栈;
PS-容量=新容量;
}
void StackPush(ST* ps,STDataType x)
{
assert(PS);
如果(ps容量==ps顶部)
{
新栈(PS);
}
PS-a[PS-top]=x;
PS-top;
}
无效堆栈弹出(ST* ps)
{
assert(PS);
断言(ps- top
如果(ps- top 0)
PS-top-;
}
STDataType StackTop(const ST* ps)
{
assert(PS);
断言(ps- top
返回PS-a[PS-top-1];
}
int StackSize(const ST* ps)
{
assert(PS);
返回ps-
}
布尔堆栈
{
return PS-top==0;
}
无效堆栈销毁(ST* ps)
{
assert(PS);
free(PS-PS-a=NULL;
PS-capacity=PS-top=0;
}
斯托克斯路径;//设置全局栈
/*///////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
//输出路径坐标
无效打印路径(ST*路径)
{
圣rPath
堆栈初始化(rPath);
而(!堆栈式(路径))
{
StackPush( rPath,stack top(path));
堆栈弹出(路径);
}
而(!StackEmpty( rPath))
{
PAT top=栈顶(rPath);
printf(( %d,%d)),top.row,top。col);
堆栈弹出(rPath);
}
堆栈销毁(rPath);
}
void Print(int** maze,int n,int m)
{
for(int I=0;我我)
{
for(int j=0;j j)
{
printf( %d ,maze[I][j]);//输入二维数组的值
}
printf( \ n );
}
printf( \ n );
}
bool IsPass(int** maze,int n,int m,PAT cur)
{
如果(当前行=0当前行n
当前列=0当前列m
迷宫[当前行][当前列]==0)
{
返回真实的
}
其他
返回错误的
}
bool GetMazePath(int** maze,int n,int m,PAT cur)
{
StackPush( path,cur);//先入栈
如果(当前行==n - 1当前列==m - 1)
{
迷宫[当前行][当前列]=2;//把出口也赋值为2
返回真实的
}
迷宫[当前行][当前列]=2;
//上
拍拍下;
下一个=当前
下一个。row-=1;
if (IsPass(maze,n,m,next))
{
if (GetMazePath(maze,n,m,next))//找到出路了
返回真实的
}
//下
下一个=当前
下一个。row=1;
if (IsPass(maze,n,m,next))
{
if (GetMazePath(maze,n,m,next))//找到出路了
返回真实的
}
//左
下一个=当前
下一个。col-=1;
if (IsPass(maze,n,m,next))
{
if (GetMazePath(maze,n,m,next))//找到出路了
返回真实的
}
//右
下一个=当前
下一个。col=1;
if (IsPass(maze,n,m,next))
{
if (GetMazePath(maze,n,m,next))//找到出路了
返回真实的
}
堆栈弹出(路径);//如果以上条件都不满足就出栈
返回错误的
}
int main()
{
int n=0,m=0;
scanf(%d,%d ,n,
//创建二维数组的行
int * * maze=(int * *)malloc(sizeof(int *)* n);
for(int I=0;我我)
{
//创建二维数组的列
maze[I]=(int *)malloc(sizeof(int)* m);
}
for(int I=0;我我)
{
for(int j=0;j j)
{
scanf(%d ,maze[I][j]);//输入二维数组的值
}
}
StackInit(路径);
PAT在path={ 0.0 }中;
if (GetMazePath(maze,n,m,InPath))
打印路径(路径);
其他
printf( false );
printf( \ n );
打印(迷宫,n,m);
堆栈销毁(路径);
for(int I=0;我我)
{
免费(迷宫【我】);
}
自由(迷宫);
迷宫=空;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。