数据结构迷宫.docx

上传人:b****6 文档编号:6626244 上传时间:2023-01-08 格式:DOCX 页数:22 大小:451.31KB
下载 相关 举报
数据结构迷宫.docx_第1页
第1页 / 共22页
数据结构迷宫.docx_第2页
第2页 / 共22页
数据结构迷宫.docx_第3页
第3页 / 共22页
数据结构迷宫.docx_第4页
第4页 / 共22页
数据结构迷宫.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

数据结构迷宫.docx

《数据结构迷宫.docx》由会员分享,可在线阅读,更多相关《数据结构迷宫.docx(22页珍藏版)》请在冰豆网上搜索。

数据结构迷宫.docx

数据结构迷宫

数据结构迷宫

 

程序代码:

#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;i

for(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键,进入下一个迷宫

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 人力资源管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1