谁帮我讲解一下这个程序,这是数据结构课程设计中的“漫步迷宫”,马上就要答辩啊。 70

这个程序是我在网上找的,可以说完全不懂,高手帮忙啊!!!#include<stdio.h>#include<stdlib.h>#defineMAX18typedefstr... 这个程序是我在网上找的,可以说完全不懂,高手帮忙啊!!!
#include <stdio.h>
#include <stdlib.h>
#define MAX 18
typedef struct
{
int row,col;
int road[MAX][MAX]; //存储矩阵 1为墙 0为空
int start_row;
int start_col;//进口坐标
int end_row;
int end_col;//出口坐标
int dingdiannum;
}ROAD;
typedef struct
{
int entry,exit;//进出口编号
int record[MAX*MAX];
int queue[MAX*MAX];//存储广度优先搜索访问到的顶点
int visited[MAX*MAX]; /*用visited[]数组标记图的结点是否遍历过*/
}SPARE;
ROAD InPut(ROAD R)//输入迷宫
{//迷宫矩阵
int i,j;
printf("请输入迷宫的规格:\n");
printf(" 行数= ");
scanf("%d",&R.row);
printf(" 列数= ");
scanf("%d",&R.col);
R.dingdiannum=R.col*R.row;
printf("顶点数为:%d\n",R.dingdiannum);
for(i=0;i<R.row;i++)
{
printf("输入 %d行 :[%d] ",i+1,i+1);
for(j=0;j<R.col;j++)
scanf("%d",&R.road[i][j]);
}
getchar();//读掉Enter键
return R;
}
SPARE Seekpass(ROAD R,SPARE S)//广度优先收索思想,寻找到出口的路径
{
int i,x,y,front=0,rear=1;
S.entry=(R.start_row-1)*R.col+R.start_col-1;
S.exit=(R.end_row-1)*R.col+R.end_col-1;
for(i=0;i<R.dingdiannum;i++)
{
S.record[i]=-1;//初始化
S.visited[i]=0;//初始化
}
S.queue[rear]=S.entry;//第一个探索顶点入队,存储顶点编号
S.visited[S.entry]=1;//标示被访问
while(front!=rear)
{
x=S.queue[front+1]%R.col;//将编号转换为坐标
y=S.queue[front+1]/R.col;
if(S.visited[y*R.col+x+1]==0&&x+1<R.col&&R.road[y][x+1]==0)//向右
{
S.visited[y*R.col+x+1]=1;
S.record[y*R.col+x+1]=S.queue[front+1];//以与坐标为<x,y>的顶点相邻的坐标顶点编号为下表存储坐标<x,y>的编号
S.queue[++rear]=y*R.col+x+1;
if((y*R.col+x+1)==S.exit)
return S;
}

if(S.visited[(y+1)*R.col+x]==0&&y+1<R.row&&R.road[y+1][x]==0)//向下
{
S.visited[(y+1)*R.col+x]=1;
S.record[(y+1)*R.col+x]=S.queue[front+1];
S.queue[++rear]=(y+1)*R.col+x;
if(((y+1)*R.col+x)==S.exit)
return S;
}

if(S.visited[y*R.col+x-1]==0&&x>0&&R.road[y][x-1]==0)//向左
{
S.visited[y*R.col+x-1]=1;
S.record[y*R.col+x-1]=S.queue[front+1];
S.queue[++rear]=y*R.col+x-1;
if((y*R.col+x-1)==S.exit)
return S;
}

if(S.visited[(y-1)*R.col+x]==0&&y>0&&R.road[y-1][x]==0)//向上
{
S.visited[(y-1)*R.col+x]=1;
S.record[(y-1)*R.col+x]=S.queue[front+1];
S.queue[++rear]=(y-1)*R.col+x;
if(((y-1)*R.col+x)==S.exit)
return S;
}
front=front+1;
}
return S;
}
void OutPut(int col,SPARE S)
{
int i=0,t;
if(S.entry==S.exit)
printf("已在出口\n");
else
if(S.record[S.exit]!=-1)
{
t=S.exit;
printf("最短路径为:\n");
while(t!=S.entry)
{
printf("[%d,%d]<-",t/col+1,t%col+1);
t=S.record[t];
if(++i%5==0)
printf("\n");
}
printf("[%d,%d]",t/col+1,t%col+1);
}
else
printf("找不到走出去的路径\n");
printf("\n");

}
ROAD Meunchooce(ROAD R)
{
int a;
char ch='y';
printf("\t欢 迎 来 到 漫 步 迷 宫!\n");
printf("***********************************************\n");
printf(" 1.输入迷宫矩阵\n");
printf(" 2.退出\n");
printf("\n***********************************************\n");
printf(" 请问您想进行怎样的操作...\n");
do{
printf(" 输入1-2的数字...\n");
scanf("%d",&a);
switch(a)
{
case 1:R=InPut(R);break;//构建迷宫
case 2:exit(0);
}
}while(a<1||a>2);
return R;
}
int main()
{
int x;
ROAD R;
SPARE S;
R=Meunchooce(R);//菜单项,选择以怎样的方式构建迷宫
printf("输入人口坐标<*,*>: ");
scanf("%d,%d",&R.start_row,&R.start_col);
printf("输入出口坐标<*,*>: ");
scanf("%d,%d",&R.end_row,&R.end_col);
getchar();//读掉Enter键

S=Seekpass(R,S);//广度优先的思想,寻路
x=R.col;
OutPut(x,S);//回溯法输出路径
}
展开
 我来答
iamagoodguy
2012-06-14 · TA获得超过840个赞
知道小有建树答主
回答量:175
采纳率:100%
帮助的人:95.4万
展开全部
原理很简单:
利用“队列”求解迷宫起始点A和终点间B最短距离 d 问题,即迷宫问题最优解。
第一次循环:所有和A距离为1的可走方块入队。
第二次循环:所有和A距离为2的可走方块入队。
。。。
第 d 次循环:所有和A距离扮前为 d 的可走方块入队。
此时,终点也入队了,找到的最短路径就存在队列里面。
从队列里面的终点开始逆向输出队列里所需元素就得到了逆路迟颂径,反过来就是最短路径厅旦清了。
如果层次遍历二叉树或BFS你会的话,应该就懂了,否则。。。。呵呵。。。。
hxr071016
2012-06-14
知道答主
回答量:29
采纳率:0%
帮助的人:6.7万
展开全部
这个你可以去参考大二的数据结构课本,丛乱有启唤个例题渗旁档相似,我们的课本刚刚学完,是高等教育出版社的,廖洪明主编
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式