【迷宫问题】用堆栈解迷宫

我们c语言实践课的题目,我实在编不出来,求助。。
题目:有一个40*60的迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
对于本问题需用栈实现“穷举求解”算法,即:从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。加入所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。迷宫数据用二维数组存储,起点为(1,1),终点为(40,60),对于迷宫中每个数据都有四个方向可通。
我们老师给了一个写好的库
#include<malloc.h>
typedef char DATA_TYPE;
struct Stack
{
DATA_TYPE *data;
int top;
int capacity;
};

int InitStack(Stack* s,int size=100)
{
s->data = (DATA_TYPE*)malloc(size*sizeof(DATA_TYPE));

if(s->data == NULL) //如果空间动态非配出错,就报错
return 0;

s->capacity = size;
s->top = 0;
return 1;
}

int IsFull(Stack* s)
{
if(s->top >= s->capacity)return 1;
else return 0;
}

int IsEmpty(Stack *s)
{
if(s->top <= 0)return 1;
else return 0;
}

int Push(Stack *s ,DATA_TYPE d)
{
if(IsFull(s))return 0;
else
{
s->data[s->top++]=d;
return 1;
}
}

int Pop(Stack* s,DATA_TYPE &d)
{
if(IsEmpty(s))
return 0;
else
{
s->top--;
d=s->data[s->top];
return 1;
}
}

int GetTop(Stack*s,DATA_TYPE &d)
{
if(IsEmpty(s))return 0;
else
{
d = s->data[s->top-1];
return 1;
}
}

int ClearStack(Stack* s)
{
s->top=0;
return 1;
}

int DestoryStack(Stack* s)
{
delete[] s->data;
s->top=-1;
s->capacity=-1;
return 1;
}

还给了思路,据他说把这思路翻译成程序语言就行,很简单的。。。简单的。。。单的。。。我知道这样都写不出来真的好废,但是还是没牙的来求助了(*+﹏+*)~
1、假设P为当前点
2、如果P为出口,则结束循环
3、检查当前点P是否有路可走,
如果有,则将P点状态打包存入堆栈,让出路上的点成为当前点P
如果没有,则将堆栈弹出,让栈顶节点成为当前点P
4、跳转2,继续循环

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>


#define MAXM 40  
#define MAXN 60
int maze[MAXM][MAXN]; // 0 1-障碍物
int m = 40, n = 60; // 40行60列
int used[MAXM][MAXN]; // 记录是否到过


int line[MAXM*MAXN]; // 记录迷宫路线
int line_len;
int line_r[MAXM*MAXN];

int d[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1} }; // 4个方向

void dfs(int u, int v, int step)
{
    int x, y, i;
    if (line_len != 0)
        return;
    if (u == m-1 && v == n-1)
    {
        line_len = step;
        memcpy(line_r, line, line_len*sizeof(int));
        return;
    }

    for (i = 0; i < 4; i++)
    {
        x = u + d[i][0];
        y = v + d[i][1];
        if (x >= 0 && x < m && y >= 0 && y < n && !used[x][y] && maze[x][y]==0)
        {
            used[x][y] = 1;
            line[step] = x << 16 | y;
            dfs(x, y, step+1);
            // used[x][y] = 0; // 不用退回来了,因为只需要一条路径
        }
    }
}

int main() 
{
    int i, j;
    // 随机生成迷宫
    srand(time(NULL));
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            maze[i][j] = rand()%8 == 0 ? 1 : 0; // 是1的概率约1/8,通路的概率大些
    maze[0][0] = maze[m-1][n-1] = 0; // 起始点和终端必须为0

    line_len = 0;
    line[0] = 0 << 16 | 0;
    memset(used, 0, sizeof(used));
    dfs(0, 0, 0); // (0,0) -> (m-1, n-1)

    if (line_len == 0)
        printf("没有通路\n");
    else
    {
        for (i = 0; i < line_len; i++)
            printf("( %d, %d )\n", (line_r[i]>>16)+1, (line_r[i]&0xffff)+1);
    }

    return 0;
}

 你给的那库实在是没什么用的欲望,要最短路径一般用广度搜索,上面的代码应该属于深度搜索

追问

那个库不能用吗。。据说好像只会用到push和pop什么的。。迷宫也是他做好的txt文件,用二进制读入到二维数组就行。。
我真是太渣了你写的有点看不懂QAQ我们要跟老师解释程序的、不用那个库看着不像自己写的说~>_<~

追答

库里面的内容用处不大,封装成一堆无用函数(说的直白了点,勿怪)
要用是替换代码里的line数组,存储结果用的

温馨提示:内容为网友见解,仅供参考
无其他回答

求助java一个二维数组代表迷宫。0代表道路 2表示墙壁。 假设老鼠会从数...
这个可以用 堆栈 来完成。用堆栈的基本思路就是。设置一个起点A。将 A 入栈 。从A开始找到第一个可以达到的点B。将 B 入栈 。如果B无路可走。则在A点处重新换一个可达到的点。否则继续 2-3 。直到达到终点。或者五路可走。详细的解释,这儿有一篇博文:http:\/\/www.cnblogs.com\/haoliuhust...

数据结构C语言版迷宫问题
首先,迷宫如何用计算机语言表示?一般用二维数组。0表示墙,1表示路。其次,其次就是如何从迷宫中走出来了。结合堆栈,进行搜索。你可以尝试着对问题进行分层,然后逐步细化来解决。如果你要解决一个别人给的走迷宫的问题,同样还是要这样,首先把别人给的迷宫在计算机中表示出来,其次结合数据结构所学的知...

C++迷宫 ,怎么原路退回
把你走的每一步记录放入一个栈中, 然后寻找是否有路径还可以走 , 如果没有, 那么退栈, 在判断当前栈顶的位置是否还有位置可以走,

pascal程序走迷宫怎么打
{迷宫问题:有一个N行M列的棋盘,凡标有1的为不可通行,标有0的为可通行.要从左上角 入口处到达右下角出口处,找出一条通路或给出不可通行信息.本题中采用堆栈实现深度优先搜索,深度优先搜索可减少搜索步数,但找到的不一定是 最短的路径,且具体路径与坐标增量的顺序有关} PROGRAM Migong;CONST zlx...

迷宫求解问题
int size;\/\/堆栈大小 }SqStack;int SqStack_Empyt(SqStack S){ if(S.top==S.base)return 1;else return 0;} int Init_SqStack(SqStack &S){ S.base=(Element *)malloc(50*sizeof(Element));\/\/分配10个元素大小容量 if(!S.base)exit (0);S.top=S.base;S.size=50;return 0;} ...

C语言 迷宫 求助 很急。不然就回不了家了
学过堆栈没?将当前位置压栈,如果下个位置为死路就出栈重新寻找下个出路~

C++的迷宫问题
题目:迷宫问题求解功能:要求找出迷宫的入口到出口的通路。分步实施:1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2.完成最低要求:至少找出一条通路;3.进一... 题目:迷宫问题求解功能:要求找出迷宫的入口到出口的通路。分步实施:1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2...

迷宫以16*16的矩阵存储在数据文件中(迷宫中的障碍物要占到一定比例...
printf("堆栈满");return;} else { PtrS->Data[++(PtrS->Top)] = item;return;} }ElementType Pop( Stack *PtrS ){ ElementType ERROR;ERROR.Col =-1;ERROR.Row =-1;ERROR.Dir =-1;if ( PtrS->Top == -1 ) { printf("堆栈空");return ERROR ; \/* ERROR是ElementType的特殊值,...

C++ DFS算法实现走迷宫自动寻路
当迷宫地图增大到一定程度,如20*20,可能会触发堆栈溢出异常。因此,程序中提供了18*18和15*15的迷宫地图用于测试。编译环境为Windows VS2019。该算法的代码包含游戏类(Game.h)和主函数文件(迷宫.cpp),并提供了一定的调试支持。如果您在使用过程中发现任何问题,欢迎指出,感谢您对本项目的贡献。

vc++ 迷宫 急急急!!!求大神帮助
include <stdio.h> #include <stdlib.h> #define MaxSize 50 typedef struct { struct { int i; int j; int di; }st[MaxSize]; int top; }MgStack; \/\/初始化顺序表 void InitStack(MgStack *&s); \/\/压入堆栈 int Push(MgStack *&s, int i, int j, int di); \/\/路径计算,...

相似回答