数据结构-顺序队列解决最短迷宫路径问题

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
int M=8,N=8;
int mg[10][10]={
{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}
};
typedef struct
{
    int i,j;    //i,j分别为横纵坐标
    int pre;    //路径的方向
}Box;
typedef struct
{
    Box data[MaxSize];
    int front,rear;
}QuType;
void print(QuType qu,int front);
int mgpath();
int mgpath(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 1;
      }
      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 1;
}
void print(QuType qu,int front)
{
    int k=front,j,ns=0;
    printf("\n");
    do
    {
        j=k;
        k=qu.data[k].pre;
        qu.data[j].pre=-1;
    }while(k!=0);             //反向搜索找出最短路径
    printf("迷宫路径图如下:\n");
    k=0;
    while(k<64)
    {
        if(qu.data[k].pre==-1)
        {
            ns++;
            printf("\t(%d,%d)",qu.data[k].i,qu.data[k].j);
            if(ns%5==0)
                printf("\n");
        }
        k++;
    }
    printf("\n");
}
int main()
{

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值