医院有A、B、C、D、E、F、G 7位大夫,在一星期内(星期一至星期天)每人要轮流值班一天,如果已知: (1)A大夫比C大夫晚1天值班; (2)D大夫比E大夫晚1天值班; (3)E大夫比B大夫早2天值班 (4)B大夫比G大夫早4天值班; (5)F大夫比B大夫晚1天值班; (6)F大夫比C大夫早1天值班; (7)F大夫星期四值班。 就可以确定周一至周日的值班人员分别为:E、D、B、F、C、A、G。 编写程序,根据输入的条件,输出星期一至星期天的值班人员。 输入格式: 先输入一个整数n,再输入n组条件,要求能够根据输入的条件确定唯一的值班表,且输入的n组条件中能够直接或间接得到任意两位大夫的关联关系,例如上面的条件(2)直接显示了D与E间的关系,而通过条件(1)、(6)、(5)可以间接得到A与B的关系。 条件的输入格式有2种: 格式1:编号 比较运算符 编号 天数 其中比较运算符有2种:> 或 < ,分别表示“早”或“晚” 例如:A<C1 表示:A大夫比C大夫晚1天值班 格式2:编号 = 数值 例如:F=4 表示:F大夫在星期四值班 输出格式: 输出周一至周日的值班序列。 输入样例: 7 A<C1 D<E1 E>B2 B>G4 F<B1 F>C1 F=4 输出样例: EDBFCAG
时间: 2024-02-29 21:51:40 浏览: 33
下面是一个 C 语言程序的实现,可以读入输入条件,然后输出每天的值班人员。
```c
#include <stdio.h>
#include <string.h>
#define MAXN 7
int n;
int id[MAXN]; // 大夫编号的索引数组
int day[MAXN]; // 每个大夫值班的日期
void swap(int *a, int *b) // 交换两个整数的值
{
int temp = *a;
*a = *b;
*b = temp;
}
int find_id(char c) // 根据字符找到对应的大夫编号
{
int i;
for (i = 0; i < MAXN; i++) {
if (id[i] == c - 'A') {
return i;
}
}
return -1;
}
int main()
{
int i, j;
char s[10];
memset(day, -1, sizeof(day)); // 初始化值班日期为-1
scanf("%d", &n);
for (i = 0; i < MAXN; i++) {
id[i] = i;
}
for (i = 0; i < n; i++) {
int x, y, d;
scanf("%s", s);
x = find_id(s[0]); // x是第一个大夫编号的索引
if (s[1] == '<') {
y = find_id(s[2]); // y比x早值班
swap(&x, &y);
} else {
y = find_id(s[2]); // y比x晚值班
}
sscanf(s + 3, "%d", &d); // 读入天数
day[id[x]] = (day[id[y]] + d) % MAXN; // 计算x的值班日期
}
// 根据题目所给的结果,从星期一开始依次输出每天值班的医生
for (i = 0; i < MAXN; i++) {
printf("%c", id[0] + 'A'); // 先输出第1个医生
for (j = 0; j < MAXN; j++) {
if (day[id[j]] == i) { // 如果第j个医生在第i天值班
printf("%c", id[j] + 'A');
break;
}
}
}
printf("\n");
return 0;
}
```
程序的基本思路是:先根据输入的条件计算出每个医生的值班日期,然后从星期一开始,依次输出每天值班的医生。程序中用一个整数数组 `day` 来记录每个医生的值班日期,其初始值为-1,表示还没有确定。对于每条输入条件,我们首先根据字符找到对应的医生编号,并将其转换为索引,然后判断这两个医生谁比较早值班,将其索引赋值给变量 `x` 和 `y`。如果条件是 `A<B1`,则表示 A 比 B 晚1天值班,因此 `x` 是 B 的索引,`y` 是 A 的索引。如果条件是 `A>B2`,则表示 A 比 B 早2天值班,因此 `x` 是 A 的索引,`y` 是 B 的索引。最后,我们根据公式 `(day[id[y]] + d) % MAXN`,计算出 `x` 的值班日期,并将其保存在数组 `day` 中。最后,我们从星期一开始,依次输出每天值班的医生,输出格式为 `EDBFCAG`。