用c语言实现简单地图导航: 1.地图不低于五个点 2.可以在代码里设置好点名,路径,路径权重 3.程序运行,输入两个点,输出最短距离及最短路径
时间: 2023-10-10 15:05:13 浏览: 54
好的,那我给您提供一个简单的思路:
1. 定义一个结构体来存储每个点的信息,包括点名、与其他点相连的路径和路径权重。
2. 定义一个二维数组来存储所有点之间的距离,初始值为无穷大(表示不连通)。可以使用 Floyd 算法或 Dijkstra 算法计算最短路径和最短距离。
3. 输入两个点名称,根据名称找到对应的结构体,得到它们在数组中的下标,然后使用最短路径算法计算它们之间的最短距离和路径。
4. 输出结果。
以下是一个示例代码,供您参考:
```c
#include <stdio.h>
#include <string.h>
#define MAX_N 100
#define INF 0x3f3f3f3f
// 存储每个点的信息
typedef struct {
char name[20];
int edges[MAX_N]; // 与其他点相连的路径
int weights[MAX_N]; // 路径权重
} Node;
Node nodes[MAX_N]; // 所有点的信息
int dist[MAX_N][MAX_N]; // 两点之间的距离
int path[MAX_N][MAX_N]; // 最短路径
int get_node_index(char* name, int n) {
// 根据点名查找对应的下标
for (int i = 0; i < n; i++) {
if (strcmp(nodes[i].name, name) == 0) {
return i;
}
}
return -1;
}
void floyd(int n) {
// Floyd算法求任意两点之间的最短距离和路径
for (int k = 0; k < n; ++k) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (dist[i][j] > dist[i][k] + dist[k][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
path[i][j] = path[i][k];
}
}
}
}
}
int main() {
int n;
printf("请输入地图中点的数量:");
scanf("%d", &n);
// 输入每个点的信息
for (int i = 0; i < n; i++) {
printf("\n请输入第%d个点的名称:", i + 1);
scanf("%s", nodes[i].name);
for (int j = 0; j < n; j++) {
if (i == j) {
dist[i][j] = 0;
path[i][j] = i;
} else {
dist[i][j] = INF;
path[i][j] = -1;
}
}
int m;
printf("请输入与该点相连的其他点的数量:");
scanf("%d", &m);
for (int j = 0; j < m; j++) {
char name[20];
int weight;
printf("请输入与该点相连的第%d个点的名称和路径权重:", j + 1);
scanf("%s %d", name, &weight);
int index = get_node_index(name, n);
if (index != -1) {
nodes[i].edges[j] = index;
nodes[i].weights[j] = weight;
dist[i][index] = weight;
path[i][index] = index;
}
}
}
// Floyd算法求任意两点之间的最短距离和路径
floyd(n);
// 输入要查询的两个点
char start[20], end[20];
printf("\n请输入起点和终点名称:");
scanf("%s %s", start, end);
int start_index = get_node_index(start, n);
int end_index = get_node_index(end, n);
if (start_index == -1 || end_index == -1) {
printf("输入的点名称不正确!");
return 0;
}
// 输出结果
printf("\n从%s到%s的最短距离为:%d\n", start, end, dist[start_index][end_index]);
printf("路径为:%s", start);
int cur = start_index;
while (cur != end_index) {
cur = path[cur][end_index];
printf("->%s", nodes[cur].name);
}
printf("\n");
return 0;
}
```
注意,这只是一个简单的示例代码,实际应用中还需要考虑输入的合法性、异常处理等问题。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![mp4](https://img-home.csdnimg.cn/images/20210720083504.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)