用栈求解迷宫问题

问题描述:二维数组mg[M][N]它表示一个M×N迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。

#include<stdio.h>
#define MaxSize 100
#define M 8
#define N 8
struct
{  int i,j; //方块在迷宫中的坐标位置(i,j)  
   int di;   //下一个方块的方位号     
} St[MaxSize];
int top=-1; 
int mg[M+2][N+2]=
{
    {1,1,1,1,1,1,1,1,1,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,0,0,1,1,0,0,1},
    {1,0,1,1,1,0,0,0,0,1},
    {1,0,0,0,1,0,0,0,0,1},
    {1,0,1,0,0,0,1,0,0,1},
    {1,0,1,1,1,0,1,1,0,1},
    {1,1,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1}
};    
bool mgpath(int xi,int yi,int xe,int ye)    //求解路径为:(xi,yi)->(xe,ye)
{   int i, j, di, i1, j1; 
    bool find;
    top++;
	St[top].i=xi;  St[top].j=yi;  St[top].di=-1; //初始方块进栈
    mg[xi][yi]=-1;               		//避免重复走到该方块 
    while (top>-1) 
	{   i=St[top].i; j=St[top].j;       //取栈顶方块(i,j)
        di=St[top].di;
        if (i==xe && j==ye)	           	//找到了出口,输出该路径
        {   printf("一条迷宫路径如下:\n");
	        for(int k=0;k<=top;k++)
                printf("(%d,%d)", St[k].i, St[k].j);
            printf("\n");
            return true;	            //输出一条迷宫路径后返回true
        }
        find=false;
        while(di<4 && !find)
        {   di++;
            switch(di)
            {
                case 0:i1=i-1;  j1=j; break;
                case 1:i1=i;  j1=j+1; break;
                case 2:i1=i+1;  j1=j; break;
                case 3:i1=i;  j1=j-1; break;
            }
            if(mg[i1][j1]==0)//找到一个相邻可走方块,设置find为真
               find=true;  
        }
        if(find)  		      //找到了一个相邻可走方块(i1,j1)
        {   St[top].di=di;	  //修改原栈顶元素的di值
            top++;            //相邻可走方块进栈
            St[top].i=i1; St[top].j=j1; St[top].di=-1;
            mg[i1][j1]=-1;	  //(i1,j1)迷宫值置为-1避免重复走到该方块
        }
        else		          //没有路径可走,则退栈
        {   mg[i][j]=0; 	  //将栈顶方块退栈
            top--;		      //让退栈方块的位置变为其他路径可走方块
        }
	}
	return false;		//表示没有可走路径
}

int main()
{ 
    if (!mgpath(1,1,M,N))
        printf("该迷宫问题没有解!");
    return 1;
}

 

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/weixin_42467709/article/details/82048471
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞