所以我有一张地图的“版式”,其结构如下所示:
a--(2)--b--(2)--c
| | |
(1) (1) (1)
| | |
d e f
| | |
(1) (1) (1)
| | |
g h i
| | |
(1) (1) (1)
| | |
j--(2)--k--(2)--l
字母(a,b,c,d ...等)代表位置点。两个字母之间的数字表示这两个点之间的距离。例如,点“ a”和点“ b”之间的距离为2,点“ a”和点“ d”之间的距离为1。
我正在尝试找出一种方法,该方法可以计算从给定起点到一组必须通过的点,然后再回到起点的最短路径。因此,例如,假设起点为点“ a”,而我需要转到点“ b”,“ e”和“ c”,则我可以采用的最佳路径是a -> b -> c -> b -> e -> b -> a
,其中总行驶距离为10个单位。我可以选择的另一条路径是a -> b -> e -> b -> c -> b -> a
,它是相同的距离(10个单位)。
在我的代码中,我已将每个点及其相对于其他点的距离存储在结构中。像这样:
struct stopPoints {
int weights[10];
char connectingPoints[10];
int startBool;
};
我已经将每个点的信息存储在字符串中,显示了它所连接的点以及权重:
char str[12][100] = {
"a = S, 2.b, 1.d",
"b = 2.a, 1.e",
"c = 2.b, 1.f",
"d = 1.a, 1.g",
"e = 1.h, 1.b",
"f = 1.i, 1.c",
"g = 1.j, 1.d",
"h = 1.k, 1.e",
"i = 1.l, 1.f",
"j = 1.g, 2.k",
"k = 2.j, 1.h, 2.l",
"l = 2.k, 1.i"
};
注意:我已经成功地分离了每个点并将所有信息存储在各自独立的结构中。另外,请注意点“ a”中如何包含字母S。这表明它是起点(也是终点)。
我一直在研究一些寻路算法,到目前为止,我认为可能适用于这种情况的最佳选择是Dijkstra的算法。唯一的问题是,我的点根本没有连接,例如点“ d”和“ e”,而且我还需要转到某些点(必须通过点),因此实施该点会有些难。我只需要从起点开始,到必须通过的点,然后再回到起点的最短路径。
我应该如何开始呢?任何建议表示赞赏。