迷宫问题(栈)

来源:互联网 发布:知乎周刊 epub 编辑:程序博客网 时间:2024/06/06 08:34

路径问题和最优路径
如图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;}
原创粉丝点击