#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#define n1 27//定义行范围
#define n2 27//定义列范围
typedef struct //创建一个结构体存储数组信息
{
int x;
int y;
int c;
}lujing;
int mg[n1][n2]; //创建一个二维数组
lujing go[n1*n2];
int i,j,k,run,v;
void array(int H,int L,int s) //以二维数组形式定义迷宫内容
{
if(s==1)
{
int a,b;
srand( (unsigned)time( NULL ) );
for(a=1;a<=H;a++)
{
for(b=1;b<=L;b++)
{
mg[a][b]=rand()%2; //输入迷宫对应的数组数据
}
}
mg[1][1]=0;
mg[H][L]=0;
for(a=1;a<=L;a++)
{
mg[1][a]=0;
}
for(a=1;a<=H;a++)
{
mg[a][L]=0;
}
for(a=0;a<H+2;a++)
{
mg[a][0]=1;
mg[a][L+1]=1;
}
for (b=0;b<L+2;b++)
{
mg[0][b]=1;
mg[H+1][b]=1;
}
}
else
{
int a,b;
printf("(注:0为通路,1为墙,数据间空格隔开):\n");
for(a=1;a<=H;a++)
{
for(b=1;b<=L;b++)
{
scanf("%d",&mg[a][b]); //输入迷宫对应的数组数据
}
}
for(a=0;a<H+2;a++)
{
mg[a][0]=1;
mg[a][L+1]=1;
}
for (b=0;b<L+2;b++)
{
mg[0][b]=1;
mg[H+1][b]=1;
}
}
}
void zou(int H,int L)
{
int zou[27][27];
int i,j,c,d;
char a;
for(i=0;i<H+2;i++)
{
for(j=0;j<L+2;j++)
{
zou[i][j]=mg[i][j];
}
}
zou[1][1]=2;
for(i=0;i<H+2;i++)//求出迷宫路线图形
{
for(j=0;j<L+2;j++)
{
if(zou[i][j]==0)
printf(" ");
else if(zou[i][j]==2)
printf("⊙");
else printf("▇");
}
printf("\n");
}
c=1;
d=1;
printf("迷宫生成成功,按任意键继续!");
getchar();
do
{
printf("请输入下一步行走方向\n");
printf("a:向左\nd:向右\ns:向下\nw:向上\nx:输出答案\n");
scanf("%c",&a);
system("cls");
if(a=='a'&&zou[c][d-1]==0)
{
zou[c][d-1]=2;
zou[c][d]=0;
d=d-1;
}
if(a=='s'&&zou[c+1][d]==0)
{
zou[c+1][d]=2;
zou[c][d]=0;
c=c+1;
}
if(a=='d'&&zou[c][d+1]==0)
{
zou[c][d+1]=2;
zou[c][d]=0;
d=d+1;
}
if(a=='w'&&zou[c-1][d]==0)
{
zou[c-1][d]=2;
zou[c][d]=0;
c=c-1;
}
for(i=0;i<H+2;i++)//求出迷宫路线图形
{
for(j=0;j<L+2;j++)
{
if(zou[i][j]==0)
printf(" ");
else if(zou[i][j]==2)
printf("⊙");
else printf("▇");
}
printf("\n");
}
}while(a!='x'&&(c!=H||d!=L));
printf("按任意键输出路径!");
getchar();
system("cls");
}
void xingzou(int H,int L)
{
char d;
int m=1;
i=0;
v=0;
go[i].x=1;//i=0时X方向对应值为0
go[i].y=1; //i=0时Y方向对应值为0
mg[1][1]=2;//入口迷宫值变为2
run=1;
for(i=0;i<H*L;i++)
go[i].c=1;
i=0;
do
{ //定义行走规则和出口判断
if(go[i].c<5)//若i点可到方向值小于5则向下进行
{
if(go[i].x==H&&go[i].y==L)//当i点为出口时所满足的条件
{
printf("第%d条通路是:\n",m++);//输出不同的路
for(j=0;j<=i;j++)
{
printf("(%d,%d)",go[j].x,go[j].y);
}//输出通路坐标
printf("\n");
for(j=0;j<H+2;j++)//求出迷宫路线图形
{
for(k=0;k<L+2;k++)
{
if(mg[j][k]==0)
printf(" ");
else if(mg[j][k]==2)
printf("⊙");
else printf("▇");
}
printf("\n");
}
printf("\n");
v=1;
mg[go[i].x][go[i].y]=0;
go[i].c=1;
i--;
go[i].c+=1;
continue;
}
switch(go[i].c)
{
case 1:
{
if(mg[go[i].x+1][go[i].y]==0)//向右
{
i++;
go[i].x=go[i-1].x+1;
go[i].y=go[i-1].y;
mg[go[i].x][go[i].y]=2;
}
else
go[i].c+=1;
break;
}
case 2:
{
if(mg[go[i].x][go[i].y+1]==0) //向下
{
i++;
go[i].x=go[i-1].x;
go[i].y=go[i-1].y+1;
mg[go[i].x][go[i].y]=2;
}
else
go[i].c+=1;
break;
}
case 3:
{
if(mg[go[i].x-1][go[i].y]==0) //向左
{
i++;
go[i].x=go[i-1].x-1;
go[i].y=go[i-1].y;
mg[go[i].x][go[i].y]=2;
}
else
go[i].c+=1;
break;
}
case 4:
{
if(mg[go[i].x][go[i].y-1]==0) //向上
{
i++;
go[i].x=go[i-1].x;
go[i].y=go[i-1].y-1;
mg[go[i].x][go[i].y]=2;
}
else
go[i].c+=1;
break;
}
}
}
else
{
if(i==0)
{
if(v!=0)
{
printf("结束!\n");
printf("是否回到菜单?(y/n)\n");
do
{
fflush(stdin);
scanf("%c",&d);
if(d=='y')
{
main();
}
if(d=='n')
{
printf("欢迎下次使用!\n");
break;
}
}while(d!='y'&&d!='n');
break;
}
else
{
printf("此迷宫无通路!\n");
printf("是否回到菜单?(y/n)\n");
do
{
fflush(stdin);
scanf("%c",&d);
if(d=='y')
{
main();
}
if(d=='n')
{
printf("欢迎下次使用!\n");
break;
}
}while(d!='y'&&d!='n');
return 0;
}
}
mg[go[i].x][go[i].y]=0;
go[i].c=1;
i--;
go[i].c+=1;
}
}while(run==1);
}
int main()
{
int i,H,L,w,s;
system("color f0");
do
{
system("cls");
printf("********** 欢迎使用迷宫求解 ********\n");
printf("***************迷宫求解请按:1 ******************\n");
printf("*************** 退出请按:2 ******************\n");
printf("**************************************************\n");
printf("输入您的选择:");
scanf("%d",&w);
getchar();
}while(w!=1&&w!=2);
switch(w)
{
case 1:
printf("输入迷宫行数和列数(提示:行列数都不能超过25!空格隔开):");
scanf("%d%d",&H,&L);
do
{
system("cls");
printf("你要创建的是%d行%d列的迷宫\n",H,L);
printf("大小创建完毕!\n自动生成迷宫请按1!\n手动生成请按2!\n");
scanf("%d",&s);
getchar();
}while(s!=1&&s!=2);
array(H,L,s);//生成迷宫
zou(H,L);
xingzou(H,L);
break;
case 2:
printf("欢迎下次使用!\n");
break;
default: break;
}
return 0;
}
c迷宫求解
最新推荐文章于 2023-10-04 12:45:43 发布