数据结构迷宫.docx
《数据结构迷宫.docx》由会员分享,可在线阅读,更多相关《数据结构迷宫.docx(22页珍藏版)》请在冰豆网上搜索。
数据结构迷宫
数据结构迷宫
程序代码:
#include
#include
#include//用于设定随机数种子
#include
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineN24
typedefstruct//定义线性表的结构
{
intord;//判断该位置是否可通(0表示不通,1表示通)(墙—█入口—⊙出口—㊣)
intseat;//判断从上一个位置到该位置的方向(东→南↓西←北↑)
intpass;//判断该位置是否走过(0表示没有走过,1表示走过)
}SElemType;
typedefstruct
{
SElemType*elem;
}List;
typedefstruct//定义栈的结构
{
intloc;//记录对应线性表中元素的位置
intseat;//判断从上一个位置到该位置的方向(东→南↓西←北↑)
intdi;//表示从此通道走向下一通道块的方向
}Element;
typedefstruct
{
Element*base;
Element*top;
intnum;
}Stack;
intw=0,Flag=0,n;
SElemType*InitList();
intMazePath1(Listmaze1,Stack&maze2);
intMazePath2(Listmaze1,Stack&maze2);
intInitList(List&maze1);
voidInitStack(Stack&maze2);
intsearch(intmark,intn);
voidOutput1(Listmaze1);
voidOutput2(Listmaze1,Stackmaze2);
voidmain()
{
inti,a=1,b,c;
Listmaze1;
Stackmaze2;
InitStack(maze2);
while(a)
{
for(i=0;i<4;i++)
{
InitList(maze1);
if(i!
=0)
printf("\n\n\n\n");
Output1(maze1);
if(w==0)
{
printf("\n\n\n\n\n\n\n\n\t\t1——计算机走迷宫\t\t2——人走迷宫");
printf("\n");
scanf("%d",&b);
}
getchar();
if(b==1)
{
system("cls");
c=MazePath1(maze1,maze2);
if(c==0)
break;
system("cls");
Output2(maze1,maze2);
maze2.top=maze2.base;
}
elseif(b==2)
{
system("cls");
c=MazePath2(maze1,maze2);
if(c==0)
break;
system("cls");
Output2(maze1,maze2);
maze2.top=maze2.base;
}
else
printf("你的输入有误,请重新输入:
");
}
system("cls");
printf("\n\n\n\n\n\n\n你是否想进入下一个迷宫\n\n\n\n\t\t\t\t1——是\t\t0——否\n");
scanf("%d",&a);
system("cls");
Flag=0;
}
}
intInitList(List&maze1)
{
inta,b=0,i,j;
staticintk=0,t=0;
srand((unsigned)time(NULL));//用于改变随机数
if(Flag==1)//用于判断路径
{
for(i=0;ifor(j=0;j{
maze1.elem[i*n+j].seat=0;
maze1.elem[i*n+j].pass=0;
}
Flag=0;
returnOK;
}
if(k==0)//初始化线性表
{
maze1.elem=(SElemType*)malloc((N*N)*sizeof(SElemType));
if(!
maze1.elem)
exit(OVERFLOW);
}
if(w==4)
{
w=0;
t=0;
k=0;
}
if(t==0)
{
while
(1)//选择迷宫的大小
{
printf("请选择迷宫的大小(4~24):
");
scanf("%d",&n);
if(n>3&&n<25)
break;
else
{
system("cls");
printf("你选择的迷宫大小有误,请重新输入\n\n");
}
}
for(i=0;i{
a=rand()%2;
maze1.elem[i].ord=a;
}
printf("\n\n\n");
for(i=0;i{
do
{
b=rand()%4;
}while(!
b);
maze1.elem[i].ord=1;
i=i+b;
}
for(i=0;i{
maze1.elem[n*n-n+i].ord=maze1.elem[i].ord=0;
maze1.elem[i*n].ord=maze1.elem[i*n+n-1].ord=0;
}
t++;
}
for(i=0;i{
for(j=0;j{
maze1.elem[i*n+j].seat=0;//只将线性表的判断方向的变量进行初始化
if(k==0)
{
maze1.elem[i*n+j].pass=0;
maze1.elem[n+1].ord=2;
maze1.elem[n*n-n-2].ord=3;
if(maze1.elem[n+2].ord==0&&maze1.elem[2*n+1].ord==0)
maze1.elem[2*n+1].ord=1;
k++;
}
}
}
returnOK;
}
intMazePath1(Listmaze1,Stack&maze2)
{
inta=0;
Elemente;
maze2.num=0;
e.loc=n+1;//设定入口
e.seat=20;e.di=1;
maze1.elem[n+1].pass=1;
*maze2.top++=e;
while(a!
=(n*n-n-2))//判断是否到终点
{
while
(1)
{
while
(1)
{
a=search(e.loc,e.di);//根据地址和方向确定下一个位置的地址
if(maze1.elem[a].pass==1||maze1.elem[a].ord==0)//判断是否走过和能否可通,否则换一个方向
e.di++;
else
break;
if(e.di>4)//如果此处的四个方向都不可通,则结束
break;
}
if(e.di>4)//若某处的四个方向都不可通吗,则将此元素出栈
{
maze2.top--;
if(maze2.top==maze2.base)//判断迷宫是否可通
{
Output2(maze1,maze2);
printf("\n\n\n\t\t\t此迷宫不能通行,欢迎进入下一个迷宫\n\n\n");
printf("\n\n\n\t\t\t\t按Enter→\n\n\n\n\n\n\n");
getchar();
w=4;
returnERROR;
}
e=*(maze2.top-1);
e.di++;
maze2.num++;//记录所走步数
Output2(maze1,maze2);
getchar();
system("cls");
}
else
break;
}
e.loc=a;//将元素入栈
e.seat=e.di+w;
if(e.di==3)//判断此元素的下一个方向
e.di=2;
else
e.di=1;
maze1.elem[a].pass=1;
*maze2.top++=e;
maze2.num++;
Output2(maze1,maze2);//将迷宫模型输出
getchar();
system("cls");
}
w++;
Flag=1;//用于标识一次路径结束
returnOK;
}
intMazePath2(Listmaze1,Stack&maze2)
{
inta=0;
charr;
Elemente;
maze2.num=0;
e.loc=n+1;
e.seat=20;
*maze2.top++=e;
system("cls");
printf("请选择方向:
");
printf("\n\nW——↑\t\tS——↓\t\tA——←\t\tD——→\t\tN——迷宫不可通");
printf("\n\n");
Output1(maze1);
printf("\n\n\n\n\n\n\t\t\t\t按Enter→\n\n\n\n\n\n\n");
getchar();
system("cls");
printf("\n\n\n\n");
Output1(maze1);
while(a!
=(n*n-n-2))
{
while
(1)
{
flushall();
r=getche();
flushall();
if(r=='W'||r=='w')
e.di=4;
elseif(r=='S'||r=='s')
e.di=2;
elseif(r=='A'||r=='a')
e.di=3;
elseif(r=='D'||r=='d')
e.di=1;
elseif(r=='N'||r=='n')
{
printf("\n\n\n\t\t\t此迷宫不能通行,欢迎进入下一个迷宫\n\n\n");
printf("\n\n\n\t\t\t\t按Enter→\n\n\n\n\n\n\n");
getchar();
w=4;
returnERROR;
}
else
{
printf("\n\n\n\n\n\n你输入的方向错误,请重新输入:
");
continue;
}
a=search(e.loc,e.di);
if(maze1.elem[a].ord==0)
{
system("cls");
Output2(maze1,maze2);
printf("\n\n\n\n\n\n此方向不可通,请重新输入:
");
}
else
break;
}
if(abs(e.di-e.seat)==2&&e.seat<5)
{
maze2.top--;
e=*(maze2.top-1);
maze2.num++;
system("cls");
Output2(maze1,maze2);
}
else
{
(maze2.top-1)->di=e.di;
e.loc=a;
e.seat=e.di;
*maze2.top++=e;
maze2.num++;
system("cls");
Output2(maze1,maze2);
}
}
w=4;
Flag=1;
returnOK;
}
voidInitStack(Stack&maze2)//对栈进行初始化
{
maze2.base=(Element*)malloc((N*N)*sizeof(Element));
if(!
maze2.base)
exit(OVERFLOW);
maze2.top=maze2.base;
}
intsearch(intmark,intm)//通过地址和方向取得相应的地址值
{
inta,i=w+1;
switch(i)
{
case1:
break;
case2:
m=m+1;break;
case3:
m=m+2;break;
case4:
m=m+3;break;
}
if(m%4==1)
a=mark+1;
elseif(m%4==2)
a=mark+n;
elseif(m%4==3)
a=mark-1;
else
a=mark-n;
returna;
}
voidOutput1(Listmaze1)//输出迷宫的初始模型
{
inti;
printf("\n\n\n\n");
for(i=0;i{
if(i%n==0)
{
if(n<14)
printf("\n\t\t\t\t");
else
printf("\n\t\t\t");
}
if(maze1.elem[i].ord==0)
printf("█");
elseif(maze1.elem[i].ord==1)
printf("");
elseif(maze1.elem[i].ord==2)
printf("⊙");
else
printf("㊣");
}
}
voidOutput2(Listmaze1,Stackmaze2)//输出迷宫的路径
{
inti,j;
staticintk=1;
if(w==0)
k=1;
Elemente;
j=maze2.top-maze2.base-1;
while(maze2.base!
=maze2.top)//将栈的元素赋值给线性表
{
e=*--maze2.top;
maze1.elem[e.loc].seat=e.seat;
}
maze1.elem[n+1].seat=20;maze1.elem[n*n-n-2].seat=30;//对入口和出口进行处理
printf("\n\n\n\n\n\n\n\n");
for(i=0;i{
if(i%n==0)
{
if(n<14)
printf("\n\t\t\t\t");
else
printf("\n\t\t\t");
}
if(maze1.elem[i].ord==0)
printf("█");
else
{if(maze1.elem[i].seat==20)
printf("⊙");
elseif(maze1.elem[i].seat==30)
printf("㊣");
else
{
if(maze1.elem[i].seat%4==1)
printf("→");
elseif(maze1.elem[i].seat%4==2)
printf("↓");
elseif(maze1.elem[i].seat%4==3)
printf("←");
elseif(maze1.elem[i].seat==4)
printf("↑");
else
printf("");
}
}
}
printf("\n\n");
if(Flag==1)//输出迷宫的总步骤和所需步骤
{
printf("\n\n\t\t\t路径%d共走%d步,所需步骤为%d步",k,maze2.num,j);
if(w==4)
printf("\n\n\n\t\t\t此迷宫已结束,欢迎进入下一个迷宫\n\n\n");
printf("\n\n\n\n\t\t\t\t按Enter→\n\n\n\n\n\n\n");
getchar();
system("cls");
k++;
}
InitList(maze1);//输出后再对线性表进行初始化
}
程序运行结果:
计算机走迷宫:
注:
每个迷宫都走四次,分别向东、南、西、北四个方向走迷宫,并计算出走到终点所走的步骤;每走一步按Enter键。
人走迷宫:
注:
分别按W,A,S,D来控制方向,如果迷宫不可通,则按N键,进入下一个迷宫