用栈和队列求解迷宫问题

1:①、定义一个顺序栈;

    ②、编写走出迷宫代码;

    ③、编写主函数。

1、栈:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream>
#define MaxSize 100
//①、定义一个顺序栈;
typedef struct
{  int i;		 
   int j;		 
   int di;		 
 } Box;		 
typedef struct
{  Box data[MaxSize];
   int top;		 
 } StType;
//②、编写走出迷宫代码;
bool mgpath(int xi,int yi,int xe,int ye)	
{  int i,j,k,di,find;
   StType 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;	
	if (i==xe && j==ye)	
	{   printf("迷宫路径如下:\n");
	    for (k=0;k<=st.top;k++)
	    {  printf("\t(%d,%d)",st.data[k].i,st.data[k].j);
		 if ((k+1)%5==0)	
			printf("\n");
	    }
	    printf("\n");
	    return true;		
	}
   find=0;
   while (di<4 && find==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) find=1; 
    }
  if (find==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--;	
   }
 }
 return false;	
}
//③、编写主函数:

  
得到迷宫路径如下:
	(1,1) (1,2)	(2,2) (3,2) (3,1) 
	(4,1) (5,1) (5,2) (5,3) (6,3) 
	(6,4) (6,5) (5,5) (4,5) (4,6) 
	(4,7) (3,7) (3,8) (4,8) (5,8) 
	(6,8) (7,8) (8,8)

2、队列

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream>
#define MaxSize 100
//①、定义一个顺序栈;
typedef struct 
{  int i,j;		      
   int pre;		      
} Box;			
typedef struct
{  Box data[MaxSize];
   int front,rear;
} QuType;
//②、编写走出迷宫代码;:
bool mgpath1(int xi,int yi,int xe,int ye)	
{  int i,j,find=0,di;
   QuType qu;		
   qu.front=qu.rear=-1;
   qu.rear++;
   qu.data[qu.rear].i=xi; qu.data[qu.rear].j=yi;
   qu.data[qu.rear].pre=-1;	
   mg[xi][yi]=-1;		  
   while (qu.front!=qu.rear && !find)  
   {  qu.front++;             
	i=qu.data[qu.front].i; j=qu.data[qu.front].j;
	if (i==xe && j==ye)     
	{  find=1; print(qu,qu.front); return true; }
	for (di=0;di<4;di++)    
	{  switch(di)
	   {
	   case 0:i=qu.data[qu.front].i-1; 
                j=qu.data[qu.front].j;    break;
	   case 1:i=qu.data[qu.front].i; 
                j=qu.data[qu.front].j+1;  break;
	   case 2:i=qu.data[qu.front].i+1;
                j=qu.data[qu.front].j;    break;
	   case 3:i=qu.data[qu.front].i;
                j=qu.data[qu.front].j-1;  break;
	   }
	   if (mg[i][j]==0)
	   {  qu.rear++;		
		  qu.data[qu.rear].i=i; qu.data[qu.rear].j=j;
		  qu.data[qu.rear].pre=qu.front; 
		  mg[i][j]=-1;
  	   }
	}
   }
   return false;	
}
//③、编写主函数:

得到迷宫路径如下:
  (1,1)(2,1)(3,1)(4,1)(5,1)
    (5,2)(5,3)(6,3)(6,4)(6,5)
    (7,5)(8,5)(8,6)(8,7)(8,8)

      通过用栈和队列两种方法来写迷宫问题。了解到了栈和队列的相同点和不同点。栈是通过回溯进行的。为了便于回溯,对于可走的方块都要进栈,并试探它的下一可走的方位,将这个可走的方位保存到栈中。这是栈对于迷宫问题选择的方法。而队列则是利用队列的特点,一层一层向外扩展可走的点,直到找到出口为止。相当于我们后面在图那章学到的广度优先搜索方法。而对于在实验期间,其中有很多字母大小写。所以经常搞混,以至于出现了一些问题。还经常会把逗号与分号搞错。

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