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

我们c语言实践课的题目,我实在编不出来,求助。。题目:有一个40*60的迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路... 我们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,继续循环
展开
 我来答
pifuzhiyong
2014-07-14 · TA获得超过815个赞
知道小有建树答主
回答量:530
采纳率:38%
帮助的人:143万
展开全部
#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数组,存储结果用的
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式