输入格式先输入一个整数n再输入n组条件要求能够根据输入的条件确定唯一的值班表且输入的n组条件中能够直接或间接得到任意两位大夫的关联关系例如上面的条件2直接显示了D与E间的关系而通过条件1、6、5可以间接得到A与B的关系。条件的输入格式有2种:格式1:编号 比较运算符 编号 天数其中比较运算符有2种: 或 分别表示早或晚例如:AC1 表示:A大夫比C大夫晚1天值班格式2:编号 = 数值例如:F=4
#include <stdio.h>
int main() { int schedule[7]; // 存放值班表 int i; for(i = 0; i < 7; i++) { schedule[i] = i + 1; // 初始化值班表 }
// 输入条件
int n;
scanf("%d", &n);
while(n--) {
char a, b, op;
int days;
scanf(" %c %c %c %d", &a, &op, &b, &days);
if(op == '>') { // a比b晚days天值班
int diff = days % 7; // 处理天数大于一周的情况
for(i = 0; i < 7; i++) {
if(schedule[i] == b) { // 找到b的值班日期
int j = (i + diff) % 7; // 计算a的值班日期
while(schedule[j] != a) { // 如果a的值班日期与其他大夫冲突则继续往后找
j = (j + 1) % 7;
}
schedule[j] = schedule[i]; // 将b的值班日期赋给a
break;
}
}
} else if(op == '<') { // b比a晚days天值班,与上面类似
int diff = days % 7;
for(i = 0; i < 7; i++) {
if(schedule[i] == a) {
int j = (i + diff) % 7;
while(schedule[j] != b) {
j = (j + 1) % 7;
}
schedule[j] = schedule[i];
break;
}
}
} else { // a在星期days值班
schedule[days-1] = a - 'A' + 1; // 将a的编号转换成序号赋给对应的值班日期
}
}
// 输出值班表
printf("周一: %c\n", schedule[0] + 'A' - 1);
printf("周二: %c\n", schedule[1] + 'A' - 1);
printf("周三: %c\n", schedule[2] + 'A' - 1);
printf("周四: %c\n", schedule[3] + 'A' - 1);
printf("周五: %c\n", schedule[4] + 'A' - 1);
printf("周六: %c\n", schedule[5] + 'A' - 1);
printf("周日: %c\n", schedule[6] + 'A' - 1);
return 0;
原文地址: https://www.cveoy.top/t/topic/fDPf 著作权归作者所有。请勿转载和采集!