#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Maxsize 50
int mg[10][10];
void shengcheng()
{
for(int i=0; i<10; i++)
{
mg[i][0]=1;
mg[i][9]=1;
mg[0][i]=1;
mg[9][i]=1;
}
srand(time(NULL));
for(int i=1; i<9; i++)
{
mg[1][1]=0;
for(int j=1; j<9; j++)
{
mg[i][j]=rand()%2;
mg[8][8]=0;
}
}
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
{
printf("%d ",mg[i][j]);
if(j==9)
printf("\n");
}
}
}
typedef struct
{
int i;
int j;
int pre;
} Box;
typedef struct
{
Box data[Maxsize];
int front1;
int rear;
} QuType;
void print(QuType qu,int front2);
bool mgpath1(int xi,int yi,int xe,int ye)
{
int i,j,find1=0,p,di,o,q;
QuType qu;
qu.front1=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][xi]=-1;
while(qu.front1!=qu.rear&&!find1)
{
qu.front1++;
i=qu.data[qu.front1].i;
j=qu.data[qu.front1].j;
o=i;
q=j;
printf("开始探索%d,%d周围的通路\n",i,j);
if(i==xe&&j==ye)
{
find1=1;
printf("迷宫有通路\n");
print(qu,qu.front1);
return true;
}
for(di=0; di<4; di++)
{
switch(di)
{
case 0:
p=0;
i=qu.data[qu.front1].i-1;
j=qu.data[qu.front1].j;
break;
case 1:
p=1;
i=qu.data[qu.front1].i;
j=qu.data[qu.front1].j+1;
break;
case 2:
p=2;
i=qu.data[qu.front1].i+1;
j=qu.data[qu.front1].j;
break;
case 3:
p=3;
i=qu.data[qu.front1].i;
j=qu.data[qu.front1].j-1;
break;
}
if(mg[i][j]==0)
{
switch(p)
{
case 0:
printf("向上探索,上有通路,坐标为:%d,%d,上一个通路的坐标为:%d,%d\n",i,j,qu.data[qu.front1].i,qu.data[qu.front1].j);
break;
case 1:
printf("向右探索,右有通路,坐标为:%d,%d,上一个通路的坐标为:%d,%d\n",i,j,qu.data[qu.front1].i,qu.data[qu.front1].j);
break;
case 2:
printf("向下探索,下有通路,坐标为:%d,%d,上一个通路的坐标为:%d,%d\n",i,j,qu.data[qu.front1].i,qu.data[qu.front1].j);
break;
case 3:
printf("向左探索,左有通路,坐标为:%d,%d,上一个通路的坐标为:%d,%d\n",i,j,qu.data[qu.front1].i,qu.data[qu.front1].j);
break;
}
qu.rear++;
qu.data[qu.rear].i=i;
qu.data[qu.rear].j=j;
qu.data[qu.rear].pre=qu.front1;
mg[i][j]=-1;
}
}
printf("%d,%d周围没有通路了!\n",o,q);
}
return false;
}
void print(QuType qu,int front2)
{
int k=front2,j;
printf("\n");
do
{
j=k;
k=qu.data[k].pre;
qu.data[j].pre=-1;
}
while(k!=0);
printf("迷宫路径如下:\n");
k=0;
while(k<qu.rear)
{
if(qu.data[k].pre==-1)
{
printf("<%d,%d> ",qu.data[k].i,qu.data[k].j);
mg[qu.data[k].i][qu.data[k].j]=5;
}
k++;
}
printf("\n");
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
{
printf("%d ",mg[i][j]);
if(j==9)
printf("\n");
}
}
printf("\n");
}
int main()
{
int n;
printf("1.开始\n");
printf("2.退出\n");
while(scanf("%d",&n)!=EOF)
{
switch(n)
{
case 1:
shengcheng();
if(!mgpath1(1,1,8,8))
printf("迷宫没有路!\n");
break;
case 2:
exit(0);
}
printf("\n\n\n");
printf("1.继续\n");
printf("2.退出\n");
}
return 0;
}
队列实现求迷宫最短路径(包含每一步的尝试状态,迷宫随机生成)
最新推荐文章于 2023-02-01 22:03:57 发布