中易网

用图论做一个求迷宫最短路径的算法?

答案:2  悬赏:0  
解决时间 2021-01-24 20:33
用图论做一个求迷宫最短路径的算法?
最佳答案
以起点为首节点开始分支,分支的个数就是当前节点有几个位置可以走,节点内容为当前所在迷宫位置
就这样不停的分支,每生成一个节点就判断是否为终点位置,是则得出结果,
输出路径。因为生成的树的层数对应的正是已走的步数,所以第一个结果必是最短的
另外在数据结构上可以多设计一个数组记录已经走过的位置,当生成的节点位置已经被走过,则可删除该节点,
这样可以减少搜索次数。
这是类似的广度搜索,如果数据量不多,用递归会更直观,简单。
全部回答
#define MAXLEN 1000
#define VERTEXNUM 6
#define INFINITE 1000
#include
int cost[7][7];
int dist[7];
int selected[7];
int normal = 0, Recursion = 0;
void creategraph(int *node, int num)
{
int from, to, i;
for (i=0; i {
from = node[i*3];
to = node[i*3+1];
cost[from][to] = node[i*3+2];
}
}
void Dijkstra(int begin, int num)
{
int min, s, i, j;
for (i=2; i<=num; i++)
{
selected[i] = 0;
dist[i] = cost[begin][i];
}
selected[begin] = 1;
dist[begin] = 0;
for (j=1; j<=num; j++)
printf("%4d ", dist[j]);
printf("\n");
for (i=1; i {
min = MAXLEN;
for (j=1; j<=num; j++)
if ((min>dist[j]) && (selected[j]==0))
{
s = j;
min = dist[j];
normal++;
}
selected[s] = 1;
for (j=1; j<=num; j++)
{
if ((selected[j] == 0) && ((dist[s]+cost[s][j]) {
dist[j] = dist[s] + cost[s][j];
normal++;
}
printf("%4d ", dist[j]);
}
printf("\n");
}
}
void initializtion(int *node, int num)
{
int from, to, i, j;
for (i=1; i<7; i++)
for (j=1; j<7; j++)
{
cost[i][j] = INFINITE;
if (i == j) cost[i][j] = 0;
}
for (i=1; i<7; i++)
{
dist[i] = INFINITE;
selected[i] = 0;
}
for (i=0; i {
from = node[i*3];
to = node[i*3+1];
cost[from][to] = node[i*3+2];
}
}
void DijkstraRecursion(int No)
{
int s, i, min, flag;

min = MAXLEN;
selected[No] = 1;
flag = 0;
for (i=1; i<7; i++)
{
if ((cost[No][i]!=-1) && ((dist[No]+cost[No][i]){
dist[i] = dist[No] + cost[No][i];
Recursion++;
}
if ((selected[i] == 0) && (min>dist[i]))
{
s = i;
min = dist[i];
flag = 1;
Recursion++;
}
}
if (flag == 1)
DijkstraRecursion(s);
else
return;
}
void SelectFirst(int No)
{
dist[No] = 0;
DijkstraRecursion(No);
}
void main()
{
int node[7][3] = {
{1, 2, 35},
{2, 3, 45},
{2, 4, 30},
{3, 5, 25},
{4, 5, 45},
{4, 6, 130},
{5, 6, 100}
};
int i, j;
for (i=1; i<7; i++)
for (j=1; j<7; j++)
cost[i][j] = MAXLEN;
creategraph((int *)node, 7);
printf("...\n");
for (i=1; i<=6; i++)
{
for (j=1; j<=6; j++)
printf("%4d ", cost[i][j]);
printf("\n");
}
printf("...\n");
Dijkstra(1, 6);
printf("...\n");
initializtion((int *)node, 7);
SelectFirst(2);
for (i=1; i<7; i++)
printf("%4d ", dist[i]);
printf("\n");
printf("normal=%d Recursion=%d\n", normal, Recursion);
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
一元可以换多少一分?
我是大三阳135转小二阳15,可以进厂工作吗?
清朝的甲和社是什么意思?
什么是全息生物学?
怎么写读书成果简介?
轻微弱智是什么意思,求助简短说。
杏花春,杨柳岸下一个
家用立式暖风机需要多少钱?
女人吃虫草有什么好处吗?同仁养生堂的好吃吗
有谁知道菜蓝市场设计这个公司吗?他们设计农
环宇运输公司地址在哪,我要去那里办事
痛风可以吃小麦和燕麦吗?
恒路物流(万豪建材市场4-19恒路物流)地址好找
请问浅蓝色卧室装修好不好?
欧普厨房灯怎么安装
推荐资讯
100立方的圆柱水池,高2米,请问直径是多少米
十堰二中什么情况,真的堕落了吗
我国的黄土高原崎岖的地表和长江三峡分别是由
车轮车架组包括哪些零部件
腿部油烫伤起泡怎么办
嘴巴抽筋了,咬不了东西,是什么问题
青春少艾是什么意思?
满月的婴儿能剃眉毛吗,宝宝的眉毛好少哦,剃
10岁儿童弱视能治好吗?
38除以6等于多少于多少
太平盛世两全保险C款(分红型)是否可退保
fifa17德赫亚和奥布拉克和库尔图瓦哪个强
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?