迷宫问题(栈)

路径问题和最优路径
如图0为可走位置,1为不可走位置
《迷宫问题(栈)》
求解思想:
用栈来实现解决问题,主要步骤是
(1)将迷宫的入口坐标设为当前坐标
(2)将当前坐标压栈,将当前坐标上的值设为-1(0变为-1),代表已走过的路
(3)判断当前坐标的四周(上下左右)是否是可以通(为0则通)的,如果是通的,那就将它的坐标设为当前坐标
(4)重复(2)(3)的操作
(5)若遇到如图1中标注的坐标,四周都不可以通(四周都不为0),那么就回退(将栈中的坐标弹出),将栈顶坐标设为当前坐标,重复步骤(3)
(6)当退回到两路的相交处则当前周围有路可以通,重复步骤(2)(3)
(7)只要判断当前位置在迷宫地图的边缘(只有边界值为0时,当前位置才可以到达边界),那么就可以判断该迷宫是否可以通
栈中的元素是迷宫通路的路线,若栈为空,则迷宫没有通路

#include<iostream>
using namespace std;
#define M 4 
#define N 4 
#define max ((M+2)*(N+2))
int mg[M+2][N+2] = {
1,1,1,1,1,1,
1,0,0,0,1,1,
1,0,1,0,0,1,
1,0,0,0,1,1,
1,1,0,0,0,1,
1,1,1,1,1,1};
typedef struct
{
    int i,j;//当期方块的位置
    int di;//方向 0-3 
}box;
typedef struct
{
    box data[max];
    int top;
}ST;
void path(int xi,int yi,int xe,int ye)
{
    int i,j,k,di,flag;
    ST st;
    st.top = -1;
//  初始位置进栈 
    st.top++;
    st.data[st.top].i = xi;
    st.data[st.top].j = yi;
    st.data[st.top].di = -1;//方向不定化 
    mg[xi][yi] = -1;
    while(st.top > -1)
    {
        //取 栈顶 元素 
        i = st.data[st.top].i;
        j = st.data[st.top].j;
        di = st.data[st.top].di;
        flag = 0;
        while(di < 4&& flag ==0)
        {
            di++;
            switch(di)
            {
                case 0:i = st.data[st.top].i-1;j = st.data[st.top].j;break;//上 
                case 1:i = st.data[st.top].i;j = st.data[st.top].j+1;break;//右
                case 2:i = st.data[st.top].i+1;j = st.data[st.top].j;break;//下 
                case 3:i = st.data[st.top].i;j = st.data[st.top].j-1;break;//左 
            }
            if(mg[i][j] == 0)flag = 1; 
        }
        if(flag == 1)
        {
            st.data[st.top].di = di;
            st.top++;
            st.data[st.top].i = i;
            st.data[st.top].j = j;
            st.data[st.top].di = -1;//方向不定化 
            mg[i][j] = -1;
        }
        else
        {
            mg[st.data[st.top].i][st.data[st.top].j] = 0;
            st.top --;
         } 
            if(i == xe&&j == ye)
    {
        printf("迷宫路径如下:\n");
        for(k = 0;k <= st.top;k++)
        {
            printf("\t(%d,%d)\n",st.data[k].i,st.data[k].j);
//          if((k+1)%5==0)printf("\n");
         } 
        printf("\n");break;
     } 
    }

}
int main()
{
    path(1,1,M,N);
    return 0;
}
    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/Andylln/article/details/78079987
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞