迷宫求解(非递归)

    上篇文章写出了利用函数形成栈桢的特性完成迷宫求解问题, 本篇文章我们自己手动维护一个栈, 其进行出栈, 入栈, 取栈顶元素, 来完成迷宫求解寻路的过程
    思路和以前一样, 首先, 我们先定义一个栈, 对其初始化, 同时, 定义一个迷宫地图, 对该地图进行初始化, 先判断当前位置是否可以落脚, 如果不能落脚就直接 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
文章标签: 非递归迷宫求解
个人分类: 数据结构
上一篇迷宫求解(递归)
下一篇线程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭