迷宫求解(非递归)

原创 2018年04月17日 08:36:21

    上篇文章写出了利用函数形成栈桢的特性完成迷宫求解问题, 本篇文章我们自己手动维护一个栈, 其进行出栈, 入栈, 取栈顶元素, 来完成迷宫求解寻路的过程
    思路和以前一样, 首先, 我们先定义一个栈, 对其初始化, 同时, 定义一个迷宫地图, 对该地图进行初始化, 先判断当前位置是否可以落脚, 如果不能落脚就直接 return, 如果能够落脚, 就将入栈同时将其标记, 标记完之后就循环取栈顶元素, 直到取栈顶元素失败时回溯, 每取一个栈顶元素就判断一下该栈顶元素是否是出口, 如果是出口, 就说明迷宫探测完毕, 如果不是出口,就按顺序(顺时针)探测该点四周的点, 判断该位置是否可以落脚, 能落脚就将其标记, 然后将其入栈,然后进入下以次循环, 如果四周的点都探测完毕, 此时就可以回溯了(出栈)

void GetPathByLoop(Maze* maze, Point entry)
{
    if(maze == NULL)
    {
        return;//非法输入
    }
    if(entry.row < 0 || entry.row >= MAX_ROW || entry.col < 0 || entry.col >= MAX_COL)
    {
        return;//非法输入
    }
    //创建栈, 并且初始化, 保存走过的路径
    SeqStack stack;
    SeqStackInit(&stack);
    //判断入口点是否可以落脚, 能落脚就将其入栈
    if(!CanStay(maze, entry))
    {
        return;
    }
    SeqStackPush(&stack, entry);
    //循环获取当前栈的栈顶元素, (栈顶元素一定可以落脚)栈为空时回溯结束
    //判断是否为出口, 是的话就退出
    while(1)
    {
        Point cur;
        int ret = SeqStackGetFront(&stack, &cur);
        if(ret == 0)
        {
            return;
        }
        if(IsExit(maze, cur, entry))
        {
            printf("找到了一条路\n");
            return;
        }
        printf("(%d, %d)\n", cur.row, cur.col);
        //按顺序取相邻元素判断是否可以落脚, 能落脚就标记入栈, 进入下一轮循环
        Point up = cur;
        up.row -= 1;
        if(CanStay(maze, up))
        {
            Mark(maze, up);
            SeqStackPush(&stack, up);
            continue;
        }

        Point right = cur;
        right.col += 1;
        if(CanStay(maze, right))
        {
            Mark(maze, right);
            SeqStackPush(&stack, right);
            continue;
        }

        Point down = cur;
        down.row += 1;
        if(CanStay(maze, down))
        {
            Mark(maze, down);
            SeqStackPush(&stack, down);
            continue;
        }

        Point left = cur;
        left.col -= 1;
        if(CanStay(maze, left))
        {
            Mark(maze, left);
            SeqStackPush(&stack, left);
            continue;
        }
        //如果四个元素都不能落脚, 就出栈
        SeqStackPop(&stack);
        //判断当前是否可以落脚
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41027326/article/details/79969317

VCL 中的一个内存泄漏 Bug

在valedit.pas中,TValueListStrings类没有实现虚拟的Destroy方法,它实现了虚拟的Clear方法, 但是它的父类TStringList的Destroy中并不通过调用Cle...
  • xuting
  • xuting
  • 2003-02-17 11:18:00
  • 556

迷宫问题求解(C++非递归程序)

                   迷宫问题求解(C++非递归程序)                一、【实验内容】【问题描述】      以一个m*n的长方阵表示迷宫,0,1分别表示迷宫中的通路和...
  • weiren2006
  • weiren2006
  • 2007-04-14 13:18:00
  • 9591

利用非递归编写迷宫

  • 2013年04月22日 22:25
  • 2KB
  • 下载

利用栈实现迷宫的非递归求解

  • 2009年12月09日 23:49
  • 6KB
  • 下载

用非递归的方法解决迷宫问题!

  • 2010年06月01日 11:04
  • 281KB
  • 下载

迷宫最短路求解

任务: 可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出。 要求:写明存储结构、迷宫求解的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另...
  • sb_Ihateyou
  • sb_Ihateyou
  • 2017-04-15 12:40:13
  • 2461

走迷宫问题——非递归算法

走迷宫问题 非递归算法 已经编译运行通过
  • sinat_34927324
  • sinat_34927324
  • 2016-12-02 21:08:01
  • 933

递归和非递归解决迷宫问题

  • 2015年11月28日 20:45
  • 7KB
  • 下载

迷宫问题,另辟蹊径,不用递归不用栈

迷宫的求解问题,通常的做法是采用穷举法, 数据结构使用到栈,这也是目前基本所有的数据结构与算法类书籍给出的一般解法。本文介绍另外一种算法求解, 不需要用到栈。算法思想: 关于迷宫, 不失一般性, 沿...
  • c20130911
  • c20130911
  • 2017-07-14 12:02:33
  • 161

迷宫问题的非递归实现

迷宫问题可以抽象为一个二维数组来求解,假设有如图示的迷宫: 解题思路: 用一个栈来存放当前人的位置的坐标,并每次测试当前位置的上、下、左、右,看哪个位置可以继续前进,可以继续前进的位置入栈,并...
  • stay_the_course
  • stay_the_course
  • 2017-03-05 21:02:36
  • 253
收藏助手
不良信息举报
您举报文章:迷宫求解(非递归)
举报原因:
原因补充:

(最多只允许输入30个字)