医院有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
c语言代码
#include<stdio.h>
struct condition{
int obj1; //用于存储输入的第一个字母- 'A'的值
int obj2; //存储第二个字母的
int num; //存储数字
int ret; //是否是 =
}condition[20];
int judge(int *a,int n); //判断函数
int main(void)
{
int n;
scanf("%d\n",&n);
int i;
char s[5];
//录入数据
for(i=0; i<n; i++){
gets(s);
condition[i].obj1 = s[0] - 'A';
if(s[1] != '='){
condition[i].obj2 = s[2] - 'A';
condition[i].num = s[3] - '0';
condition[i].ret = 0; //如果输入的不是 = 就ret录为1;
}
else{
condition[i].num = s[2] - '0';
condition[i].ret = 1;
}
if(s[1] == '<'){
condition[i].num *= -1; //如果是 < 存储的数字变为负;
}
}
//循环给数组赋值 0~6各种情况,在给判断函数判断是否符合输入的条件。
int day[7] ; //值班顺序 ,下标表示 ABCDEFG,对应值表示时间。
int a,b,c,d,e,f,g;
for(a=0; a<7; a++){
for(b=0; b<7 ; b++){
for(c=0; c<7 ; c++){
for(d=0; d<7 ; d++){
for(e=0; e<7 ; e++){
for(f=0; f<7 ; f++){
for(g=0; g<7 ; g++){
day[0] = a;
day[1] = b;
day[2] = c;
day[3] = d;
day[4] = e;
day[5] = f;
day[6] = g;
if(judge(day,n)) //判断是否符合输入的条件。
goto E;
}
}
}
}
}
}
}
E:
if(judge(day,n)){
char Day[8];
for(i=0; i<7; i++){
Day[day[i]] = i + 'A'; //把值班时间按顺序写入对应大夫
}
Day[8] = '\0';
puts(Day);
}
return 0;
}
int judge(int *a,int n){
int i = 0;
int ret = 1;
//判断传入的值班日期与输入的条件是否符合。
for(i=0; i<n; i++)
{
//如果是 = ,就判断值班日期和条件日期-1是否相等 .(值班日期是从0开始算的)
if(condition[i].ret){
if(a[condition[i].obj1] != condition[i].num - 1)
ret = 0;
break;
}
else if(a[condition[i].obj1] + condition[i].num != a[condition[i].obj2]){
ret = 0;
break;
}
}
return ret;
}