代码如下:
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
#define MaxSize 100
typedef struct
{ int i; //行
int j; //列
int di; //下一个可走相邻方块的方位号
}Box; //定义方块类型
typedef struct
{ Box data[MaxSize];
Box Path[MaxSize];
int top; //栈顶指针
}StType; //顺序栈
void mgpath(int xi,int yi,int xe,int ye)
{
int mg[20][20];
int m=0,n=0;
int M,N;
printf("输入迷宫大小:");
scanf("%d",&M);
scanf("%d",&N);
printf("\n");
for(m=0;m<M+2;m++)
for(n=0;n<N+2;n++){
if(n==0||m==0||n==N+1||m==M+1)
mg[m][n]=1;
else
mg[m][n]=rand()/16383;
}
mg[xi][yi]=0;
mg[xe][ye]=0;
printf("***************\n");
printf("迷宫地图如下:\n");
for(m=0;m<M+2;m++)
for(n=0;n<N+2;n++){
printf("%d",mg[m][n]);
if(n==N+1)
printf("\n");
}
printf("***************\n\n");
printf("所有路径如下:\n");
int i,j,k,di,find;
int count=1; //路径计数
int minlen=MaxSize;
StType st; //定义栈st
st.top=-1; //初始化
st.top++; //初始方块进栈
st.data[st.top].i=xi;
st.data[st.top].j=yi;
st.data[st.top].di=-1;
mg[xi][yi]=-1;
while(st.top>-1) //栈不为空时循环
{ i=st.data[st.top].i;
j=st.data[st.top].j;
di=st.data[st.top].di; //取栈顶方块
if(i==xe&&j==ye)
{
printf("%4d: ",count++);
for(k=0;k<=st.top;k++)
{ printf("\t(%d,%d)",st.data[k].i,st.data[k].j);
if((k+1)%5==0)
printf("\n\t");
}
printf("\n");
if(st.top+1<minlen)
{ for(k=0;k<=st.top;k++)
st.Path[k]=st.data[k];
minlen=st.top+1;
}
mg[i][j]=0;
st.top--;
i=st.data[st.top].i;
j=st.data[st.top].j;
di=st.data[st.top].di;
}
find=0;
while(di<4&&find==0) //找下一个可走方块
{ di++;
switch(di)
{
case 0:i=st.data[st.top].i-1;j=st.data[st.top].j;break; //上
case 1:i=st.data[st.top].i;j=st.data[st.top].j+1;break; //右
case 2:i=st.data[st.top].i+1;j=st.data[st.top].j;break; //下
case 3:i=st.data[st.top].i;j=st.data[st.top].j-1;break; //左
}
if(mg[i][j]==0) find=1; //找到下一个可走相邻方块
}
if(find==1)
{ st.data[st.top].di=di; //找到了下一个可走方块
st.top++; //下一个可走方块进栈
st.data[st.top].i=i;
st.data[st.top].j=j;
st.data[st.top].di=-1;
mg[i][j]=-1; //避免重复走到该方块
}
else
{ mg[st.data[st.top].i][st.data[st.top].j]=0; //让该位置变为其他路径可走方块
st.top--; //该方块退栈
}
}
printf("最短路径");
printf("长度: %d\n",minlen);
printf("路径: ");
for(k=0;k<minlen;k++)
{printf("(%d,%d) ",st.Path[k].i,st.Path[k].j);
if((k+1)%5==0)printf("\n\t");
}
if(minlen==0)
printf("无解");
printf("\n");
}
void main(){
int xi,yi,xe,ye;
printf("迷宫旅行游戏现在开始!!!\n");
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n\n");
printf("输入起始位置xi,yi:");
scanf("%d",&xi);
scanf("%d",&yi);
printf("输入终点位置xe,ye:");
scanf("%d",&xe);
scanf("%d",&ye);
mgpath(xi,yi,xe,ye);
}
2 个解决方案
#1
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
#2
赵四老师说的好,这事是你尿急要上厕所啊,我也帮不上你,只能看你尿裤子了
#1
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
#2
赵四老师说的好,这事是你尿急要上厕所啊,我也帮不上你,只能看你尿裤子了