用队列实现迷宫求解

#include "Stdio.h"

#include "Conio.h"

 

#define m 5

#define n 5

#define NUM m*n

 

 

typedef struct

{

  int x,y;

  int pre;

}sqtype;

 

 

 

 

typedef struct

{

  int dx;

  int dy;

 

}moved;

 

void printpath(sqtype sq[],int rear)

{

  int i;

  i=rear;

 

  do

  {

    printf("(%d,%d)/n",sq[i].x,sq[i].y);

    i=sq[i].pre;

  }while(i!=-1);

}

 

void restore(int (*p)[n])

{

  int i,j;

  for(i=1;i<=m-2;i++)

   for(j=1;j<=n-2;j++)

    { 

 

    if((*(p+i))[j]==-1)

       (*(p+i))[j]=0;

 

 

     }

}

void showMaze(int maze[m][n])

{

     int i,j;

  for(i=0;i<m;i++)

  {

    for(j=0;j<n;j++)

    { 

       printf("%d",maze[i][j]);

     }

    printf("/n");

  }

}

int shortpath(int maze[m][n],moved move[4])

{

  sqtype sq[NUM];

  int front,rear;

  int x,y,i,j,v;

 

  front=rear=0;

  sq[0].x=1; sq[0].y=1; sq[0].pre=-1; /*-1表示起点下标*/

  maze[1][1]=-1; /*-1表示搜索过了*/

 

  while(front<=rear)

  {

 

    x=sq[front].x; y=sq[front].y;

 

    for(v=0;v<4;v++)

    {

 

      i=x+move[v].dx; j=y+move[v].dy;

      /* (i,j)为前进方向 */

      if(maze[i][j]==0) /*可走*/

      {

        rear++;  /*入队*/

        sq[rear].x=i;

        sq[rear].y=j;

        sq[rear].pre=front;

        maze[i][j]=-1; /*避免重复搜索*/

      }

 

      if(i==m-2 && j==n-2)

      {

        printpath(sq,rear); /* 打印迷宫 */

        restore(maze);  /*恢复迷宫,使maze中-1全变成0*/

        return 1;

      }

    }

    front++;

  }

 

  return 0;

}

main() 

   int maze[m][n]={

 

                       {1,1,1,1,1},

                       {1,0,0,0,1},

                       {1,0,0,0,1},

                       {1,0,0,0,1},

                       {1,1,1,1,1},

 

                  };

   int result;

 

 

   moved move[4];

 

   /*四个方向位移*/

   move[0].dx=1;   /*南*/

   move[0].dy=0;

 

   move[1].dx=0;   /*东*/

   move[1].dy=1;

 

   move[2].dx=0;   /*西*/

   move[2].dy=-1;

 

   move[3].dx=-1;    /*北*/

   move[3].dy=0;

 

  showMaze(maze);

  result= shortpath(maze,move);

 

 

getch(); 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值