先来一张女神的图片防止定定神,防止晕码
一,需求分析
1.通过识别用户输入来判断用户的操作行为。
2.要求用户自定义一个迷宫包括出入口(输入1为围墙,0为通路,迷宫最外层为一圈围墙,需要用户自己输入)。
3.迷宫若有解,则在迷宫上打印出路径,路径由 ‘*’ 组成,若是求解时走进死胡同则将死胡同用 ’@‘ 标记。
二,概要设计
1.定义栈的数据类型及基本操作。
2.定义迷宫数据类型及基本操作。
3.程序分为迷宫设计,迷宫求解,迷宫打印和路径打印四个模块。
三,详细设计
1.坐标位置类型
typedef struct//定义位置
{
int r ,c;
}PosType;
2.迷宫类型
typedef struct//定义迷宫类型
{
int m,n;
char arr[RANGE][RANGE];//各个位置取 空格,#,*,@
int flag; //标记迷宫是否建立否为0是为1
}MazeType;
************************************************************************
int Initmaze(MazeType *maze)//建立迷宫
{
int i,j;
printf("请输入迷宫行数与列数:\n");
scanf("%d %d",&(maze->m),&(maze->n));
int a[maze->m][maze->n];
maze->flag=1; //标记迷宫已经建立
printf("请输入迷宫(0代表通道 1代表障碍 )\n");
for(i=0;i<maze->m;i++) //开始建立迷宫
{
for(j=0;j<maze->n;j++)
{
scanf("%d",&a[i][j]);
switch(a[i][j])
{
case 0: maze->arr[i][j]=' ';break;
case 1: maze->arr[i][j]='#';break;
default:return error;
}
}
}
printf("迷宫建立成功!\n");
return 0;
}
************************************************************************
stack MazePath(MazeType *maze) //寻找出路(求解时在当前位置依次向东,南,西,北四个方向去探索,如果可以走通就走向那个位置,并将那个位置纳入栈,如果都走不通就退回上一个位置并把此位置移出栈如果栈没有元素可移说明无路可退,迷宫无解
{
PosType start,end,curpos;
printf("请输入入口和出口坐标\n");
scanf("%d%d%d%d",&start.r,&start.c,&end.r,&end.c);
curpos=start;
stack s;
InitStack(&s);
s.top->date.di=0;
SElemType e;
int step=1;
e=CreatElem(start,0,step);
Push(&s,e);
s.stacksize++;
maze->arr[start.r][start.c]='*';
while(1) //开始寻找出路
{
if(pass(maze,curpos,1)==1)//如果东不是来向且向东能通则往东走
{
step++; //计步器加加
curpos.c++; //当前位置更新
e=CreatElem(curpos,1,step); //创造节点数据
Push(&s,e); //此数据入栈
s.stacksize++; //栈的元素个数加一
maze->arr[curpos.r][curpos.c]='*'; //迷宫中此位置成为路径中的一步
if(comp(curpos,end)) //如果到达出口则返回
{
printf("路径已找到\n");
return s;
}
}
else if(pass(maze,curpos,2)==1)//否则如果南不是来向且向南能通则往南走
{
step++;
curpos.r++;
e=CreatElem(curpos,2,step);
Push(&s,e);
s.stacksize++;
maze->arr[curpos.r][curpos.c]='*';
if(comp(curpos,end))
{
printf("路径已找到\n");
return s;
}
}
else if(pass(maze,curpos,3)==1)//否则如果西不是来向且向西能通则往西走
{
step++;
curpos.c--;
e=CreatElem(curpos,3,step);
Push(&s,e);
s.stacksize++;
maze->arr[curpos.r][curpos.c]='*';
if(comp(curpos,end))
{
printf("路径已找到\n");
return s;
}
}
else if(pass(maze,curpos,4)==1)//否则如果北不是来向且向北能通则往北走
{
step++;
curpos.r--;
e=CreatElem(curpos,4,step);
Push(&s,e);
s.stacksize++;
maze->arr[curpos.r][curpos.c]='*';
if(comp(curpos,end))
{
printf("