迷宫求解数据结构设计完整代码_数据结构实验(2):使用栈的方法求解迷宫从入口到出口的路径...

题目:求解迷宫从入口到出口的路径。输入一个迷宫,求从入口通向出口的可行路径。为简化问题,迷宫用二维数组 int maze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入, 若读入迷宫大小的值是n(3

6207ef8a546c62d97ee61585e70d32ef.png

本题要求必须使用严格的搜索顺序,即从右,从下,从左,从上,并非要找到最短路径,例如上图我们得到的路径应该是:

7244fbb4366e0308e434d885f60b899a.png

所以应该得到程序结果为:

fbd4080c8423d65c1b1252a73c900e33.png

对于此题,数据结构老师要求使用栈的解法,一般首先想到的是动态规划,那栈的解法又该如何解决此问题呢?

首先参考到数据结构书关于这一部分的讲解:

515912baec7ddcfde054ad333a54956d.png

作为一种不太好想到其实也并不优秀的解法,该如何去写这一题呢?

首先,进入一个位置,就将该位置压入栈中,该位置验证失败那就弹出该位置,如果成功完成,就修改标志,输出,结束。

优化:

①采用c++结构体定义Point,用于保存是否读写过,是否可以走,终点的信息。

②重载标准输出流,使得可以方便地输出(x,y)结构。

本题采用顺序栈,顺序栈代码在之前已有讲解,公众号回复栈即可获取相关讲解。

代码如下:

#include #include using namespace std;struct Point{    int x, y;    int data;    int flag = 0;    Point(int x = 0, int y = 0) : x(x), y(y) {}}; //定义结构体ostream &operator<const Point &p){    out << '(' << p.x << ',' << p.y << ')';    return out;} //重载输出流,便于输出//写栈操作typedef struct{    int top;    Point *base;    int stacksize;} sqstack; //定义栈//初始化操作int initstack(sqstack *s){    s->base = (Point *)malloc(100 * sizeof(Point));    if (!s->base)        return -1; //提高鲁棒性    s->top = 0;    s->stacksize = 100;    return 0;}//出栈int pop(sqstack *s, Point *e){    if (s->top == 0)        return -1;    *e = s->base[--s->top]; //pop会向后移位所以要先自减    return 0;}//入栈int push(sqstack *s, Point *p){    if (s->top == s->stacksize)    {        s->base = (Point *)realloc(s->base, (s->stacksize + 1) * sizeof(Point));        if (!s->base)            return -1;        s->stacksize++;    }    s->base[s->top++] = *p;    return 0;}//摸顶int gettop(sqstack *s, Point *e){    if (!s->top)        return -1;    *e = s->base[s->top - 1];    return 0;}sqstack sq;Point map[15][15];int flag=0;void print(){    for (int i = 0; i < sq.top; i++)    {        cout << sq.base[i];    }}void findways(Point *now, int mode)//从now以mode 走一步{    if (now->flag == 2)    {        push(&sq, now);        print();        flag=1;//标志    }    if (flag||now->data == 1 || now->flag == 1)        return;    push(&sq, now);    now->flag = 1;    int i = now->x;    int j = now->y;    switch (mode)    {    case 0:        j++;        break;    case 1:        i++;        break;    case 2:        j--;        break;    case 3:        i--;        break;//用switch进行分流    }    for (int k = 0; k < 4&&!flag; k++)        findways(&map[i][j], k);    pop(&sq, now);    return;}int main(){    initstack(&sq);//初始化栈    int size;    cin >> size;    for (int i = 0; i < size; i++)        for (int j = 0; j < size; j++)        {            cin >> map[i][j].data; //录入信息            map[i][j].x = i;            map[i][j].y = j;        }    map[size - 2][size - 2].flag = 2;    for (int i = 0; i < 2; i++)        findways(&map[1][1], i);//一开始第一步两种可能    if(flag==0)cout<<"NO";}

输出如上图结果,该结果是正确的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值