c语言 值班安排

医院有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;
}
  • 12
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值