用c语言源代码写一个模拟全国城市之间的咨询交通程序,为旅客提供两种或三种最优的交通路线。
时间: 2024-04-04 19:35:05 浏览: 75
设计、实现一个全国大城市间的交通咨询程序
好的,以下是用 C 语言编写的模拟全国城市之间的咨询交通程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CITY_NUM 100 // 城市数量最大值
#define MAX_COST 1000000 // 最大花费
#define INF 0x3f3f3f3f // 无穷大
// 交通工具结构体
typedef struct {
int time; // 旅途时间
int cost; // 旅费
} Transport;
// 城市结构体
typedef struct {
char name[20]; // 城市名称
int transport_num; // 交通工具数量
Transport transport[3]; // 交通工具列表
} City;
// 初始化城市信息
void init_city(City* city, char* name, int transport_num, Transport* transport) {
strcpy(city->name, name);
city->transport_num = transport_num;
for (int i = 0; i < transport_num; i++) {
city->transport[i] = transport[i];
}
}
// 计算最优交通路线
void calc_best_route(City* cities, int city_num, int start, int end, int type) {
int dp[MAX_CITY_NUM][MAX_CITY_NUM]; // 动态规划数组
int choice[MAX_CITY_NUM][MAX_CITY_NUM]; // 路线选择数组
memset(dp, 0x3f, sizeof(dp)); // 初始化为无穷大
dp[start][start] = 0; // 起点到起点的距离为0
// 根据旅客类型选择权重因子
int weight = 1;
if (type == 1) {
weight = 2;
}
// 动态规划计算最短路径
for (int len = 1; len < city_num; len++) {
for (int i = 0; i < city_num; i++) {
int j = i + len;
if (j >= city_num) {
break;
}
for (int k = i; k < j; k++) {
for (int t = 0; t < cities[i].transport_num; t++) {
for (int s = 0; s < cities[k].transport_num; s++) {
int time = cities[i].transport[t].time + cities[k].transport[s].time;
int cost = cities[i].transport[t].cost + cities[k].transport[s].cost;
if (dp[i][j] > dp[i][k] + dp[k][j] + time * weight + cost) {
dp[i][j] = dp[i][k] + dp[k][j] + time * weight + cost;
choice[i][j] = k;
}
}
}
}
}
}
// 输出最优路径
printf("最短旅程为:%d小时 %d元\n", dp[start][end], dp[start][end] * 10);
printf("路线为:%s", cities[start].name);
for (int i = start; i != end; i = choice[i][end]) {
printf(" -> %s", cities[choice[i][end]].name);
}
printf(" -> %s\n", cities[end].name);
}
int main() {
// 城市信息
City cities[MAX_CITY_NUM];
int city_num = 0;
// 添加城市信息
Transport transport1[] = {{1, 1000}, {2, 500}, {5, 200}};
init_city(&cities[city_num++], "北京", 3, transport1);
Transport transport2[] = {{1, 800}, {3, 600}, {6, 300}};
init_city(&cities[city_num++], "上海", 3, transport2);
Transport transport3[] = {{1, 500}, {2, 300}, {4, 100}};
init_city(&cities[city_num++], "广州", 3, transport3);
Transport transport4[] = {{1, 200}, {3, 150}, {5, 80}};
init_city(&cities[city_num++], "成都", 3, transport4);
Transport transport5[] = {{2, 400}, {4, 200}, {7, 150}};
init_city(&cities[city_num++], "西安", 3, transport5);
// 输出城市信息
printf("城市信息:\n");
for (int i = 0; i < city_num; i++) {
printf("%s:\n", cities[i].name);
for (int j = 0; j < cities[i].transport_num; j++) {
printf(" %d小时 %d元\n", cities[i].transport[j].time, cities[i].transport[j].cost * 10);
}
}
// 计算最优交通路线
int start = 0, end = 1, type = 0;
calc_best_route(cities, city_num, start, end, type);
return 0;
}
```
在这个程序中,我们定义了`City`结构体来存储城市信息,包括城市名称和交通工具列表。我们还定义了`Transport`结构体来存储交通工具信息,包括旅途时间和旅费。
在`main`函数中,我们初始化了一些城市信息,然后调用`calc_best_route`函数来计算最优交通路线。在这个函数中,我们采用动态规划的方法,将问题分解为子问题,并逐步求解。
最后,我们输出了最优交通路线的结果,包括最短旅程和路线。
阅读全文