迷宫的简单实现

迷宫

使用一个二维数组模拟迷宫,在这里使用栈结构和回溯的算法简单实现迷宫。

给定一个入口,先将入口坐标入栈。再对四个方向进行判断,是否能走,如果能走将下一个节点入栈。当无路可走时,出栈节点,回溯到上一个节点进行上一步判断。当找到一个出口时
再回溯到上一个岔路口,寻找另外通路。

如果将所有节点出栈,则说明迷宫无出口。

//假设该迷宫为带环并且有多个出口一个入口
//假设1为迷宫的通路,0不可以走
int m[N][N] = {
    0, 0, 0, 0, 0, 0,
    0, 0, 1, 1, 1, 0,
    1, 1, 1, 0, 1, 0,
    0, 0, 1, 0, 1, 0,
    1, 1, 1, 1, 1, 1,
    0, 0, 1, 0, 0, 0 }

寻找迷宫的出口

int MazeGetPath2(pos entry)    //闯入入口的节点坐标,entry为坐标的结构体
{

    Stack p;
    Stack* path;
    int t1=0;
    pos cur;
    pos next;
    path = &p;
    path->top = -1;


    path->r[++path->top] = entry;  //将出发点入栈
    while (path->top != -1)   //若栈为空则证明无出口
    {



             cur = path->r[path->top];//取栈定数据
            m[cur.row][cur.col] = 2;    //若是走过的数组便将值置为2

        if ((cur.col == 0 || cur.col == 5 || cur.row == 0 || cur.row == 5)&&(cur.col!=entry.col&&cur.row!=entry.row))  //出口位于数组边界且不等于入口
        {   
            t1++;
            printf("出口%d%d %d\n",t1, cur.row, cur.col);
                path->top--;      //从出口回溯到岔路口,不断回溯将所有的路都走遍
                continue;   
        }
        //探测下一个位置,上下左右
        next = cur;
        next.row += 1;
        if (MazeChecklsAccess(&next))
        {
            path->r[++path->top] = next;
            continue;
        }
        next = cur;
        next.row -= 1;
        if (MazeChecklsAccess(&next))
        {
            path->r[++path->top] = next;
            continue;
        }
        next = cur;
        next.col -= 1;
        if (MazeChecklsAccess(&next))
        {
            path->r[++path->top] = next;
            continue;
        }
        next = cur;
        next.col += 1;
        if (MazeChecklsAccess(&next))
        {
            path->r[++path->top] = next;
            continue;
        }
        path->top--;  //如果走不通回溯到上一个节点
    } //回溯到上一个节点
    if (t1 == 0)   //t1为出口个数计数器没有一条出口
    {
        printf("无出口\n");
        return 0;
    }
else 
    return 1;    //若有出口返回1
}

`

结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/M_jianjianjiao/article/details/82120490