C语言实现值班表生成算法:根据条件确定唯一值班序列
#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/ojUf 著作权归作者所有。请勿转载和采集!