用c语言实现简单地图导航: 1.地图不低于五个点 2.可以在代码里设置好点名,路径,路径权重 3.程序运行,输入两个点,输出最短距离及最短路径
时间: 2024-01-21 08:18:44 浏览: 77
这个问题需要使用图论中的最短路径算法来解决。常见的算法有 Dijkstra 算法和 Floyd 算法。下面是一个使用 Dijkstra 算法实现地图导航的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NODES 100
#define INF 0x7fffffff
struct Edge {
int to, weight, next;
};
struct Graph {
int nodes[MAX_NODES];
int edges[MAX_NODES * MAX_NODES];
int head[MAX_NODES];
int edge_cnt;
};
void add_edge(struct Graph *graph, int from, int to, int weight) {
graph->edges[graph->edge_cnt] = to;
graph->edges[graph->edge_cnt + 1] = weight;
graph->edges[graph->edge_cnt + 2] = graph->head[from];
graph->head[from] = graph->edge_cnt;
graph->edge_cnt += 3;
}
void dijkstra(struct Graph *graph, int start, int end) {
int dist[MAX_NODES];
int visited[MAX_NODES];
int prev[MAX_NODES];
memset(visited, 0, sizeof(visited));
memset(prev, -1, sizeof(prev));
for (int i = 0; i < MAX_NODES; ++i) {
dist[i] = INF;
}
dist[start] = 0;
for (int i = 0; i < MAX_NODES; ++i) {
int min_dist = INF, min_node = -1;
for (int j = 0; j < MAX_NODES; ++j) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
min_node = j;
}
}
if (min_node == -1) {
break;
}
visited[min_node] = 1;
for (int j = graph->head[min_node]; j != -1; j = graph->edges[j + 2]) {
int neighbor = graph->edges[j];
int weight = graph->edges[j + 1];
if (dist[min_node] + weight < dist[neighbor]) {
dist[neighbor] = dist[min_node] + weight;
prev[neighbor] = min_node;
}
}
}
printf("Shortest distance from %d to %d is %d\n", start, end, dist[end]);
printf("Shortest path: %d", end);
int node = end;
while (prev[node] != -1) {
printf(" <- %d", prev[node]);
node = prev[node];
}
printf("\n");
}
int main() {
struct Graph graph;
memset(graph.head, -1, sizeof(graph.head));
graph.edge_cnt = 0;
graph.nodes[0] = 1;
graph.nodes[1] = 2;
graph.nodes[2] = 3;
graph.nodes[3] = 4;
graph.nodes[4] = 5;
add_edge(&graph, 1, 2, 1);
add_edge(&graph, 1, 3, 3);
add_edge(&graph, 2, 3, 1);
add_edge(&graph, 2, 4, 2);
add_edge(&graph, 3, 4, 1);
add_edge(&graph, 3, 5, 1);
add_edge(&graph, 4, 5, 2);
int start, end;
printf("Enter start node: ");
scanf("%d", &start);
printf("Enter end node: ");
scanf("%d", &end);
dijkstra(&graph, start, end);
return 0;
}
```
这个示例代码中,我们使用了 Dijkstra 算法来求解最短路径。首先,我们定义了一个结构体 `Graph`,用于存储图的节点和边信息。在 `add_edge` 函数中,我们把一条边添加到图中。在 `dijkstra` 函数中,我们使用 Dijkstra 算法来计算从起点到终点的最短路径。最后,我们输出最短距离和最短路径。
在这个示例中,我们的地图有五个节点,节点之间的距离、权重已经在代码中设置好了。你可以根据需要修改节点数量、节点之间的距离和权重,以适应你自己的地图。