迷宫问题 有源代码Word格式文档下载.docx
《迷宫问题 有源代码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《迷宫问题 有源代码Word格式文档下载.docx(30页珍藏版)》请在冰点文库上搜索。
从键盘输入迷宫1表示墙0表示通路,并把01存入结构体m1中用flag表示通路初始化通路的标志域。
(2)inread();
//从文件读出迷宫
事先已将迷宫存入文件中,从文件读出迷宫1表示墙0表示通路,并把01存入结构体m1中用flag表示通路初始化通路的标志域。
(3)zoumigong();
//走迷宫
根据m1判断该坐标四周如果为墙并且标志域为0则可走,将该坐标入栈,将其标志域更改为1,更新坐标,继续判断,知道更新坐标等于出口坐标.栈中存放就是通路的逆序坐标。
(4)print1()//以坐标形式输出
将栈中坐标出栈,存入数组中以坐标形式输出。
(5)print2()//以矩阵形式输出
将栈中坐标出栈,存入数组中以矩阵形式输出。
四.详细设计
1.
功能函数的调用关系图
2.各功能函数的数据流程图
该坐标西边可有通路,该坐标入站,标志域赋1,更新坐标
3.重点设计及编码
typedefstruct
{
intmg[200];
inttop;
}seqstack;
typedefstructmigong
intm1;
//存放墙
intflag;
//标志域
}smaze[20][20];
intempty(seqstack&
s)//判栈空
if(s.top==-1)
return0;
else
return1;
}
voidpop(seqstack&
s,int&
x1)//出栈
return;
x1=s.mg[s.top];
s.top--;
voidpush(seqstack&
s,inty1,intx1)//入栈
if(s.top==20)
s.top++;
s.mg[s.top]=y1;
s.mg[s.top]=x1;
voidzumigong(seqstack&
stack,smaze&
maze,int&
m,int&
n)//走迷宫
inti,j,cout;
intx1,a,b,y1,x,y,x2,y2;
printf("
输入入口的横纵坐标,空格隔开\n"
);
scanf("
%d%d"
&
x,&
y);
输入出口的横纵坐标,空格隔开\n"
x2,&
y2);
for(i=0;
i<
=m+1;
i++)
{
for(j=0;
j<
=n+1;
j++)
{
if(maze[i][j].m1==1)
printf("
■"
else
□"
}
printf("
\n"
}
x1=x;
y1=y;
if(maze[x1][y1].m1==1)
此路不通:
return;
if(maze[x2][y2].m1==1)
入口为墙。
请重新输入\n"
else
while(x1!
=x2||y1!
=y2)
if(maze[x1][y1+1].m1==0&
&
maze[x1][y1+1].flag==0)
cout=0;
else
if(maze[x1+1][y1].m1==0&
maze[x1+1][y1].flag==0)
cout=1;
else
if(maze[x1-1][y1].m1==0&
maze[x1-1][y1].flag==0)
cout=2;
else
if(maze[x1][y1-1].m1==0&
maze[x1][y1-1].flag==0)
cout=3;
else
cout=4;
switch(cout)
{
case0:
a=x1;
b=y1;
maze[x1][y1].flag=1;
y1=y1+1;
push(stack,b,a);
//列先入
break;
case1:
x1=x1+1;
case2:
x1=x1-1;
case3:
y1=y1-1;
case4:
if(empty(stack)!
=0)
{
pop(stack,x1);
pop(stack,y1);
break;
}
{
printf("
此路没有通路:
return;
}
}
push(stack,y2,x2);
五.测试数据及运行结果
1.正常测试数据和运行结果
1.测试数据
2,运行结果
1.坐标形式
2.矩阵形式
3文件保存结果
2.异常测试数据及运行结果
六.调试情况,设计技巧及体会
1.改进方案
设置标志域使访问判断坐标更方便。
2.体会
通过这段时间的课程设计,本人对计算机的应用,数据结构的作用以及C语言的使用都有了更深的了解。
尤其是C语言的进步让我深刻的感受到任何所学的知识都需要实践,没有实践就无法真正理解这些知识以及掌握它们,使其成为自己的财富。
在理论学习和上机实践的各个环节中,通过自主学习和请教老师,我收获了不少。
当然也遇到不少的问题,也正是因为这些问题引发的思考给我带了收获。
从当初不喜欢上机写程序到现在能主动写程序,从当初拿着程序不只如何下手到现在知道如何分析问题,如何用专业知识解决实际问题的转变,我发现无论是专业知识还是动手能力,自己都有很大程度的提高。
在这段时间里,我对for、while等的循环函数用法更加熟悉,逐渐形成了较好的编程习惯。
在老师的指导帮助下,同学们课余时间的讨论中,这些问题都一一得到了解决。
在程序的调试能力上,无形中得到了许多的提高。
例如:
头文件的使用,变量和数组的范围问题,定义变量时出现的问题等等。
在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础。
在这次短短的课程实践里,我们得到了李培老师的关心和帮助。
她给了我们很多的信息,与我们一起探讨问题,询问我们遇到了哪些问题并耐心给予指导。
当我们遇到技术上难以解决的问题时,她就会指导我们解决问题
七.参考文献
《数据结构——C语言描述》耿国华主编,高等教育社出版。
#include<
stdio.h>
stdlib.h>
typedefstruct
voidinista(seqstack&
s)
s.top=-1;
x1)
s,inty1,intx1)
voidinread(smaze&
maze,intm,intn)
charname[20];
inti,j;
printf("
输入存放迷宫的文件名\n"
scanf("
%s"
name);
FILE*fp=fopen(name,"
rt"
if(fp==NULL)
{
\n打开文件%s失败\n"
exit
(1);
}
for(i=1;
m+1;
i++)
for(j=1;
n+1;
fscanf(fp,"
%d"
maze[i][j].m1);
if(maze[i][j].m1==0)
maze[i][j].flag=0;
else
maze[i][j].flag=1;
fclose(fp);
for(i=0;
{
maze[i][0].m1=1;
maze[i][0].flag=1;
//加两堵列墙
maze[i][n+1].m1=1;
maze[i][n+1].flag=1;
for(j=0;
j++)//加两堵行墙
maze[0][j].m1=1;
maze[m+1][j].m1=1;
maze[0][j].flag=1;
maze[m+1][j].flag=1;
n)
voidprint1(seqstackstack)
ints1[20],s2[20],i=0,j=0,n=0;
while(stack.top!
=-1)
n++;
pop(stack,s1[i]);
pop(stack,s2[i]);
i++;
j++;
}
以坐标形式输出迷宫路径\n"
迷宫路径为:
for(i=n-1;
i>
=1;
i--)
<
%d,%d>
→"
s1[i],s2[i]);
%d%d>
s1[0],s2[0]);
请输入要保存路径的文件名\n"
wb"
fprintf(fp,"
迷宫路径:
=0;
fprintf(fp,"
"
已成功保存于%s文件中"
voidprint2(seqstack&
ints1[20],s2[20],i=0,j=0,n1,n2;
pop(stack,s2[j]);
n1=s1[i];
n2=s2[j];
maze[n1][n2].flag=2;
以形象的矩阵形式输出迷宫路径·
表示走过的痕迹⊙表示迷宫路径\n"
如下所示\n"
if(maze[i][j].m1==0&
maze[i][j].flag==0)
maze[i][j].flag==1)
·
"
maze[i][j].flag==2)
⊙"
voidsavefile(smazemaze,int&
n)
输入迷宫:
=m;
=n;
scanf("
%d"
if(maze[i][j].m1==1)
请输入保存的文件名:
wt"
printf("
fprintf(fp,"
maze[i][j].m1);
fputc('
\n'
fp);
intprint()
inti;
·
\n"
软件1班·
付·
添·
★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n"
★欢迎进入迷宫系统★\n\n"
★●①从键盘输入迷宫★\n\n"
★●②从文件读出迷宫★\n\n"
★●③走迷宫★\n\n"
★●④以坐标形式输出迷宫路径★\n\n"
★●⑤以形象的矩阵形式表示路径★\n\n"
★●10退出走迷宫系统★\n\n"
★◆输入你要执行的功能序号★\n\n"
★★★★★★★★★★★★★★★★★★★★★★★★★★★\n"
i);
returni;
intmain()
seqstackstack;
inista(stack);
intm,n,f;
smazemaze;
while(f!
=10