✅简介:与大家一起加油,希望文章能够帮助各位!!!!
保持学习、保持热爱、认真分享、一起进步!!!
试验任务:
请设计一个简单的医院导航系统,该医院主要有以下部门:门诊部(A)、住院部(B)、急诊部(C)、药房(D)、收费室(E)、化验室(F)、放射科(G)、手术室(H)、B超室(I)、行政楼(J),各部门之间的路径及距离如图1所示。
要求:
(1)请利用C/C++/Java语言定义数据类型;
(2)请利用邻接矩阵或邻接表创建带权图,以表示该医院各部门之间的关系;
(3)提供各部门信息查询,如输入“急诊部”,显示“急诊部”相关信息的介绍;
(4)输入任意部门A和部门B的名称,为患者提供从A到B的最短路径|。
思路:
数据定义:
- 使用数组来存储部门的名称、介绍信息以及邻接矩阵来表示部门之间的距离和路径。
- 部门信息使用两个数组
department
和briefly
分别存储部门名称和介绍信息。- 邻接矩阵
distances
用于存储部门间的路径距离,其中使用最大值表示不连通。用户交互:
- 提供了一个菜单式的用户交互界面,用户可以选择查询部门信息或者查询两个部门之间的最短路径。
- 用户输入被简单地使用
scanf
函数获取,也可以根据需要增加一些异常输入的处理。查询部门信息:
- 通过
Select_Department
函数实现了根据用户输入查询部门信息的功能。查询最短路径:
- 使用 Dijkstra 算法来计算最短路径,通过
Dijkstra
函数实现最短路径的查询。
完整代码如下:
#include
#include
#define NUM 10
#define MAX 100
#define max_len 9999
int step = 1;
char department[NUM][10]={
"门诊部", "住院部", "急诊部", "药房", "收费室",
"化验室", "放射科", "手术室", "B超室", "行政楼"
};
char briefly[NUM][100]={
"门诊部提供各种门诊服务",
"住院部提供住院治疗服务",
"急诊部提供紧急治疗服务",
"药房提供各种医疗用药",
"收费室负责收费业务",
"化验室提供各种化验服务",
"放射科提供各种放射检查服务",
"手术室提供各种手术治疗服务",
"B超室提供各种B超检查服务",
"行政楼提供行政服务"
};
// 邻接矩阵来表示医院各部门之间的距离和路径,max_len表示不连通
int distances[NUM][NUM] = {
{0,max_len, 100,max_len,190, 150, max_len, max_len, max_len, max_len},
{max_len, 0 ,max_len, max_len, max_len, 60, 130, 50, 100,max_len},
{100 , max_len, 0, 120, max_len, max_len, max_len, max_len, max_len, 80},
{max_len,max_len,120, 0 ,50, max_len, max_len, max_len,max_len, max_len},
{max_len, max_len, max_len, 50, 0,150, max_len, max_len,max_len, max_len},
{150, 60, max_len, max_len,150, 0, max_len, 100, max_len, max_len},
{max_len, 130,max_len, max_len, max_len, max_len, 0, 100, 30,160},
{max_len, 50 , max_len, max_len, max_len, 100, 100, 0, max_len, max_len},
{max_len, max_len, max_len, max_len, max_len, max_len, 30, max_len, 0, max_len},
{90,max_len, 80, max_len, max_len, max_len,160, max_len, max_len , 0}
};
void Select_Department () {
printf("请输入要查询的部门信息\n");
char name[10];
int i;
scanf("%s",name);
for ( i=0; i<10 && strcmp(name, department[i]); i++);
if (i == 10)
printf("输入错误,即将返回首页");
else
printf("%s:%s\n",department[i],briefly[i]);
}
int PrintMinDist(int dist[], int prev[], int val) {
if (prev[val] == -1) {
printf("%s ", department[val]);
return 0;
}
else {
int length = PrintMinDist(dist, prev, prev[val]);
printf("-> %s ", department[val]);
return length + distances[prev[val]][val];
}
}
//辅助函数,找到距离集合U最近的节点
int findMinV (int dist[], bool U[], int v) {
int min = max_len,min_index;
for (int i=0; i dist[i]) {
min = dist[i];
min_index = i;
}
}
}
return min_index;
}
void Dijkstra (int graph[][NUM], int start, int v,int end) {
// 存储起始顶点到各顶点的最短距离
int dist[v];
// 记录顶点是否已被访问
bool visited[v];
// 记录路径上的前一个顶点
int prev[v];
//初始化数组
for (int i=0; i
以上均是个人的理解,如果有不对的地方请各位大佬帮忙斧正!!
追光的人,终会光芒万丈!!