用c语言实现简单地图导航: 1.地图不低于五个点 2.可以在代码里设置好点名,路径,路径权重 3.程序运行,输入两个点,输出最短距离及最短路径
时间: 2024-01-21 21:16:08 浏览: 28
好的,这是一个比较典型的图论问题,可以使用 Dijkstra 算法来求解。下面给出一个简单的 C 语言实现:
```c
#include <stdio.h>
#include <string.h>
#include <limits.h>
#define MAX_VERTICES 100
typedef struct {
int adj[MAX_VERTICES][MAX_VERTICES];
int weight[MAX_VERTICES][MAX_VERTICES];
int nvertices;
} Graph;
void init_graph(Graph *g) {
int i, j;
g->nvertices = 5;
for (i = 0; i < g->nvertices; i++) {
for (j = 0; j < g->nvertices; j++) {
g->adj[i][j] = 0;
g->weight[i][j] = INT_MAX;
}
}
// 设置点名
char *names[] = {"A", "B", "C", "D", "E"};
for (i = 0; i < g->nvertices; i++) {
printf("请输入 %s 的邻接点,用空格分隔,以 -1 结束:", names[i]);
int v = -1;
scanf("%d", &v);
while (v != -1) {
g->adj[i][v] = 1;
printf("请输入 %s 和 %s 之间的距离:", names[i], names[v]);
scanf("%d", &g->weight[i][v]);
printf("请输入 %s 的邻接点,用空格分隔,以 -1 结束:", names[i]);
scanf("%d", &v);
}
}
}
void dijkstra(Graph *g, int start, int end) {
int i, j;
int dist[MAX_VERTICES], prev[MAX_VERTICES];
int selected[MAX_VERTICES] = {0};
// 初始化
for (i = 0; i < g->nvertices; i++) {
dist[i] = INT_MAX;
prev[i] = -1;
}
dist[start] = 0;
for (i = 0; i < g->nvertices; i++) {
int min_dist = INT_MAX, min_vertex = -1;
// 选出距离最短的点
for (j = 0; j < g->nvertices; j++) {
if (!selected[j] && dist[j] < min_dist) {
min_dist = dist[j];
min_vertex = j;
}
}
if (min_vertex == -1) break;
selected[min_vertex] = 1;
// 更新距离和前驱节点
for (j = 0; j < g->nvertices; j++) {
if (g->adj[min_vertex][j]) {
int weight = g->weight[min_vertex][j];
if (dist[min_vertex] + weight < dist[j]) {
dist[j] = dist[min_vertex] + weight;
prev[j] = min_vertex;
}
}
}
}
// 输出结果
printf("从 %d 到 %d 的最短距离为 %d,路径为:", start, end, dist[end]);
int path[MAX_VERTICES], count = 0;
while (end != -1) {
path[count++] = end;
end = prev[end];
}
for (i = count - 1; i >= 0; i--) {
printf("%d ", path[i]);
}
printf("\n");
}
int main() {
Graph g;
init_graph(&g);
int start, end;
printf("请输入起点和终点的编号(从 0 开始):");
scanf("%d %d", &start, &end);
dijkstra(&g, start, end);
return 0;
}
```
这个实现中,我们使用邻接矩阵来表示图,其中 `adj[i][j]` 表示第 `i` 个点和第 `j` 个点是否有连边,`weight[i][j]` 表示第 `i` 个点和第 `j` 个点之间的距离。在初始化图的时候,我们可以通过输入来设置点名、路径和路径权重。在求解最短路径的时候,我们使用 Dijkstra 算法,首先初始化距离数组和前驱数组为无穷大和 -1,然后选出距离最短的点加入已选集合,更新其邻接点的距离和前驱节点,直到所有点都加入已选集合或者没有可选点为止。最后,我们输出从起点到终点的最短距离和路径。