用C语言实现迷宫求解问题

最近学数据结构的,看到个迷宫求解的问题,拿老师的代码来仔细专研,研究了大半天,才看出个端倪,

是采用先进后出的

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define m 8
#define n 8
struct stype
{int r,c,pre;
}sq[400];
int maze[m+2][n+2];/*define maze*/
int zx[8]={-1,-1,0,1,1,1,0,-1},zy[8]={0,1,1,1,0,-1,-1,-1};/*X,Y移动增量,八个方向*/

void printpath(int rear);

void mazepath( )
{
   int i,j,x,y,v,find,rear,front;
   sq[1].r=1;
   sq[1].c=1;
   sq[1].pre=0;
   find=0;
   j=0;
   front=1;                              //从(1,1)开始搜索
   rear=1;
   maze[1][1]=1;//有改动
   while(front<=rear&&!find)
   {
      x=sq[front].r;
      y=sq[front].c;
      for(v=0;v<8;v++)                 //循环扫描每个方向
      {
          i=zx[v]+x;                    //选择一个前进方向(i,j)
          j=zy[v]+y;
          if(maze[i][j]==0)            //如果该方向可走
          {
              rear++;                   //进入队列
              sq[rear].r=i;
              sq[rear].c=j;
              sq[rear].pre=front;
              maze[i][j]=-1;            //避免搜索过的位置重复搜索
          }
          if(i==m&&j==n)             //找到了出口
          {
             printpath(rear);
             find=1;
          }
       }
       front++;
   }
   if(!find) printf("不存在路径!");
}

void printpath(int rear)/*输出路径算法*/
{
   int i,j;
   struct stype p[100];
   i=rear;
   do
   {
      printf("(%d,%d)",sq[i].r,sq[i].c);
      i=sq[i].pre;
   }while(i!=0);
}

void main()
{
 int i,j;
 printf("输入迷宫:");
   for(i=0;i<=m+1;i++)
   {
      printf("第%d行:/n",i);
      for(j=0;j<=n+1;j++)
         scanf("%d",&maze[i][j]);
   }
   printf("输出迷宫:/n");
   for(i=0;i<=m+1;i++)
   {
      for(j=0;j<=n+1;j++)
         printf("%d",maze[i][j]);
      printf("/n");
   }
printf("路径为:");
mazepath();
   getch();
}

最后找到的路径为(8,8)(7,8)(6,7)(5,6)(4,5)(3,4)(3,3)(2,2)(1,1)

从[1][1] 开始,按北,东北,东,东南,南,西南,西,西北的方向分别对[0][1],[0][2],[1][2],[2][2],[2][1],[2][0],[1][0],[0][0]

进行扫描,如果该方向可走,把该通道放入队列,并把此通道赋值为-1,可避免重复搜索,其他文字还有很多懒得再写了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值