数据结构迷宫Word文件下载.docx
《数据结构迷宫Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构迷宫Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
}Stack;
intw=0,Flag=0,n;
SElemType*InitList();
intMazePath1(Listmaze1,Stack&
maze2);
intMazePath2(Listmaze1,Stack&
intInitList(List&
maze1);
voidInitStack(Stack&
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)
{
\n\n\n\n\n\n\n\n\t\t1——计算机走迷宫\t\t2——人走迷宫"
\n"
scanf("
%d"
&
b);
}
getchar();
if(b==1)
system("
cls"
c=MazePath1(maze1,maze2);
if(c==0)
break;
Output2(maze1,maze2);
maze2.top=maze2.base;
}
elseif(b==2)
c=MazePath2(maze1,maze2);
else
你的输入有误,请重新输入:
"
}
system("
printf("
\n\n\n\n\n\n\n你是否想进入下一个迷宫\n\n\n\n\t\t\t\t1——是\t\t0——否\n"
scanf("
a);
Flag=0;
}
}
maze1)
inta,b=0,i,j;
staticintk=0,t=0;
srand((unsigned)time(NULL));
//用于改变随机数
if(Flag==1)//用于判断路径
n;
for(j=0;
j<
j++)
maze1.elem[i*n+j].seat=0;
maze1.elem[i*n+j].pass=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("
n);
if(n>
3&
&
n<
25)
break;
你选择的迷宫大小有误,请重新输入\n\n"
n*n;
i++)//随机产生迷宫
a=rand()%2;
maze1.elem[i].ord=a;
}
\n\n\n"
)//用于避免产生太多死迷宫
do
b=rand()%4;
}while(!
maze1.elem[i].ord=1;
i=i+b;
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;
maze1.elem[i*n+j].seat=0;
//只将线性表的判断方向的变量进行初始化
if(k==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;
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
if(e.di>
4)//如果此处的四个方向都不可通,则结束
if(e.di>
4)//若某处的四个方向都不可通吗,则将此元素出栈
maze2.top--;
if(maze2.top==maze2.base)//判断迷宫是否可通
{
Output2(maze1,maze2);
printf("
\n\n\n\t\t\t此迷宫不能通行,欢迎进入下一个迷宫\n\n\n"
\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++;
//记录所走步数
getchar();
else
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();
w++;
Flag=1;
//用于标识一次路径结束
charr;
system("
printf("
请选择方向:
\n\nW——↑\t\tS——↓\t\tA——←\t\tD——→\t\tN——迷宫不可通"
\n\n"
Output1(maze1);
\n\n\n\n\n\n\t\t\t\t按Enter→\n\n\n\n\n\n\n"
getchar();
=(n*n-n-2))
flushall();
r=getche();
if(r=='
W'
||r=='
w'
)
e.di=4;
elseif(r=='
S'
s'
e.di=2;
A'
a'
e.di=3;
D'
d'
)
e.di=1;
N'
n'
w=4;
returnERROR;
\n\n\n\n\n\n你输入的方向错误,请重新输入:
continue;
}
a=search(e.loc,e.di);
if(maze1.elem[a].ord==0)
\n\n\n\n\n\n此方向不可通,请重新输入:
if(abs(e.di-e.seat)==2&
e.seat<
5)
maze2.top--;
e=*(maze2.top-1);
maze2.num++;
system("
Output2(maze1,maze2);
(maze2.top-1)->
di=e.di;
e.loc=a;
e.seat=e.di;
*maze2.top++=e;
w=4;
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;
case3:
m=m+2;
case4:
m=m+3;
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;
if(i%n==0)
if(n<
14)
\n\t\t\t\t"
\n\t\t\t"
if(maze1.elem[i].ord==0)
█"
elseif(maze1.elem[i].ord==1)
"
elseif(maze1.elem[i].ord==2)
⊙"
㊣"
voidOutput2(Listmaze1,Stackmaze2)//输出迷宫的路径
inti,j;
staticintk=1;
if(w==0)
k=1;
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;
//对入口和出口进行处理
\n\n\n\n\n\n\n\n"
{if(maze1.elem[i].seat==20)
elseif(maze1.elem[i].seat==30)
if(maze1.elem[i].seat%4==1)
→"
elseif(maze1.elem[i].seat%4==2)
↓"
elseif(maze1.elem[i].seat%4==3)
←"
elseif(maze1.elem[i].seat==4)
↑"
if(Flag==1)//输出迷宫的总步骤和所需步骤
\n\n\t\t\t路径%d共走%d步,所需步骤为%d步"
k,maze2.num,j);
if(w==4)
\n\n\n\t\t\t此迷宫已结束,欢迎进入下一个迷宫\n\n\n"
\n\n\n\n\t\t\t\t按Enter→\n\n\n\n\n\n\n"
k++;
InitList(maze1);
//输出后再对线性表进行初始化
程序运行结果:
计算机走迷宫:
注:
每个迷宫都走四次,分别向东、南、西、北四个方向走迷宫,并计算出走到终点所走的步骤;
每走一步按Enter键。
人走迷宫:
注:
分别按W,A,S,D来控制方向,如果迷宫不可通,则按N键,进入下一个迷宫