堆栈的应用--迷宫求解程序

//均已调试通过,编译器为DEV C++

 #include <stdio.h>
#define Stack_Size 100
//*******定义每个块类型**********
typedef struct{
        int flag;
        int zhangai;
        int data;
        int up,down,left,right;
        }Block;
//***********定义栈类型****************       
typedef struct {
        int *top;
        int *base;
        int stacklength;
        }SqStack,*Pstack;       
//**************创建空堆栈******************
void InitStack(Pstack S)
        {
              S->base=(int *)malloc(Stack_Size*sizeof(int));
              if(!S->base)
                  exit(1);
              S->top=S->base;
              S->stacklength=Stack_Size;
        }
//****************取栈顶元素************************
void GetTop(Pstack S,int *e)
      {
             if(S->top==S->base)
                 exit(1);
              *e=*(S->top-1);
      }
//***************入栈***************
void Push(Pstack S,int e)
          {
                 if(S->top-S->base>=Stack_Size)
                    exit(1);
                  *(S->top++)=e;
          }
//**************出栈****************
void Pop(Pstack S,int *e)
        {
                if(S->top==S->base)
                    exit(1);
                *e=*(--S->top);
        }
//**************清空堆栈******************
void ClearStack(Pstack S)
        {
              S->top=S->base;
        }
 //*******************主函数****************
 int main()
    {
          Pstack T;
          InitStack(T);
          Block K[10][10];
          int x,y;
          int e;
          int i,j;
          int n,m;
          printf("please input mikong size:/n");
          printf("n:");
          scanf("%d",&n);
          printf("m:");
          scanf("%d",&m);
          for(i=0;i<n;i++)
              for(j=0;j<m;j++)
              {
                      K[i][j].flag=0;
                      K[i][j].zhangai=0;
                      K[i][j].data=i*(m+1)+j;
                      K[i][j].up=0;
                      K[i][j].down=0;
                      K[i][j].left=0;
                      K[i][j].right=0;
              }
 //***************设置障碍**********************            
              printf("please set zhangai:/n");
              for(i=0;i<n;i++)
                  for(j=0;j<m;j++)
                     {
                           printf("/nK[%d][%d].zhangai:/n",i,j);
                           scanf("%d",&K[i][j].zhangai);
                     }
 //****************设置入口地址 ***************                  
              printf("please set enter inaddress:/n");
              int in1,in2;
              printf("in1:");
              scanf("%d",&in1);
              printf("/ni2:");
              scanf("%d",&in2);
  //***************设置出口地址******************
              printf("please set exit outaddress:/n");
              int out1,out2;
              printf("out1:");
              scanf("%d",&out1);
              printf("/nout2:");
              scanf("%d",&out2);
 
       Push(T,K[in1][in2].data);
        K[in1][in2].flag=1;
 //******************向四周寻找通路**************************
        x=in1,y=in2;
        while(1)
              {
                  if(x==out1&&y==out2)
                      break;
                  if(K[x][y].up!=1&&(x-1)>=0&&K[x-1][y].zhangai==0&&K[x-1][y].flag==0)
                         {
                               K[x][y].up=1;
                               x=x-1;
                               Push(T,K[x][y].data);
                               K[x][y].flag=1;
                               e=1;
                               if(x==out1&&y==out2)
                                     break;    //跳出while循环
                                     continue; //终止while循环
                         }
                     if(K[x][y].down!=1&&(x+1)<=n&&K[x+1][y].zhangai==0&&K[x+1][y].flag==0)
                            {
                                      K[x][y].down=1;
                                      x=x+1;
                                      Push(T,K[x][y].data);
                                      K[x][y].flag=1;
                                      e=3;
                                      if(x==out1&&y==out2)
                                             break;
                                             continue;
                            }          
                         if(K[x][y].left!=1&&(y-1)>=0&&K[x][y-1].zhangai==0&&K[x][y-1].flag==0)
                            {
                                      K[x][y].left=1;
                                      y=y-1;
                                      Push(T,K[x][y].data);
                                      K[x][y].flag=1;
                                      e=2;
                                      if(x==out1&&y==out2)
                                             break;
                                             continue;
                            }          
                           if(K[x][y].right!=1&&(y+1)<=m&&K[x][y+1].zhangai==0&&K[x][y+1].flag==0)
                            {
                                      K[x][y].right=1;
                                      y=y+1;
                                      Push(T,K[x][y].data);
                                      K[x][y].flag=1;
                                      e=4;
                                      if(x==out1&&y==out2)
                                             break;
                                            continue;  
                            }
                 if(T->top==T->base)
                       break;
                  Pop(T,&K[x][y].data); //周围无通路,后退
                  if(e==1)
                     {
                          x=x+1;
                          y=y;
                     }
                     else if(e==2)
                        {
                                  x=x;
                                  y=y-1;
                        }
                        else if(e==3)
                            {
                                     x=x-1;
                                     y=y;
                            }
                         else if(e==4)
                             {
                                      x=x;
                                      y=y+1;
                             }
               if(T->top==T->base)
                     printf("No road,/n");
                else
                    {
                                Pstack G;
                                InitStack(G);
                                while(T->top!=T->base)
                                      {
                                              Pop(T,&e);
                                              Push(G,e);
                                      }
                                      printf("the road is /n");
                                while(G->base!=G->top)
                                        {
                                               Pop(G,&K[x][y].data);
                                               printf("%d",K[x][y].data);
                                        }
                    }
       }
                    return 0;
 }                      
                                     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值