迷宫的解

来源:互联网 发布:中国气象站点数据 编辑:程序博客网 时间:2024/04/30 09:06


#include <stdio.h>
#include "time.h"

#define MaxSize 100
#define M 8
#define N 8
void prints(int s[10][10])
{
 int i,j;
 for(i=0;i<10;i++)
 { for(j=0;j<10;j++)
  {if(s[i][j]==1)printf("█");
  else if(s[i][j]==0)printf("  ");
  else if(s[i][j]==2)printf("  ");
  else printf("●");
  }printf("/n");
  }
}
int mg[M+2][N+2]=

 {1,1,1,1,1,1,1,1,1,1},
 {1,0,0,0,1,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}
};

struct
{ int i,j;   /*方块的位置*/
 int pre;   /*本路径中上一方块在Qu中的下标*/
} Qu[MaxSize];
int front=-1,rear=-1; /*分别为队首指针和队尾指针*/
void print(int front) /*从队列中输出路径*/
{
 int k=front,j;
 
 do    /*反向找到最短路径,将该路径上的方块的pre成员设置成-1*/
 { j=k;
  k=Qu[k].pre;
  Qu[j].pre=-1;
 } while (k!=0);
 k=0;
 while (k<MaxSize)  /*正向搜索到pre为-1的方块,即构成正向的路径*/
 { if (Qu[k].pre==-1)
  { mg[Qu[k].i][Qu[k].j]=3;//将正向路径中的方块都置为3,作为标记
   }
  k++;
 }
 
 
}
int mgpath(int xi,int yi,int xe,int ye)     /*搜索路径为:(xi,yi)->(xe,ye)*/
{
 int i,j,find=0,di;
 rear++;
 Qu[rear].i=xi;Qu[rear].j=yi; /*(xi,yi)进队*/
 Qu[rear].pre=-1; 
 mg[1][1]=-1;     /*将其赋值-1,以避免回过来重复搜索*/
 while (front<=rear && !find) /*队列不为空且未找到路径时循环*/
 { 
  front++;     /*出队,由于不是环形队列,该出队元素仍在队列中*/
  i=Qu[front].i;j=Qu[front].j;
  if (i==xe && j==ye)   /*找到了出口,输出路径*/
  { 
   find=1;    
   print(front);   /*调用print函数输出路径*/
   return(1);    /*找到一条路径时返回1*/
  }
  for (di=0;di<4;di++)  /*循环扫描每个方位,把每个可走的方块插入队列中*/
  { 
   switch(di)
   {case 1:i=Qu[front].i;j=Qu[front].j+1;break;
    case 3:i=Qu[front].i,j=Qu[front].j-1; break;
     
  case 2:i=Qu[front].i+1;j=Qu[front].j;break;
  case 0:i=Qu[front].i-1;j=Qu[front].j;break;
  
   }
   if (mg[i][j]==0)
   { rear++;    /*将该相邻方块插入到队列中*/
    Qu[rear].i=i;Qu[rear].j=j;
    Qu[rear].pre=front; /*指向路径中上一个方块的下标*/
    mg[i][j]=2;  /*将其赋值-1,以避免回过来重复搜索*/
   }
  }
     }
     return(0);      /*未找到一条路径时返回1*/
}
int main()
{int i,j=0;
system("title 少杰的迷宫@Jokers_i");
system("color 3b");
 printf("迷宫如下,你知道怎么走出去吗?输入“4”就能显示答案哦!/n");
 prints(mg);
 scanf("%d",&i);
 if(i==4)
{ printf("迷宫路径如下:/n");
printf("耗时%GS==%i/n",clock()/1000.0,clock());

 mgpath(1,1,M,N);
prints(mg);printf("耗时%GS/n",clock()/1000.0);
}
//else printf("其实你真的很笨!");
system("pause");
return 0;}