医院有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
#include<stdio.h>
#include<string.h>
char d1[10],d2[10],op[10];
int num[10];
void arrange(char* table,int n);
void read(char* str,char* table,int i)
{
int l=strlen(str);
d1[i]=str[0];
op[i]=str[1];
if(l==3)
{
num[i]=str[2]-'0';
table[num[i]]=d1[i];
}
else
{
num[i]=str[3]-'0';
d2[i]=str[2];
}
return;
}
int main()
{
int n;
scanf("%d",&n);
char table[20];
char str[5];
for(int i=0;i<20;i++)table[i]='0';
for(int i=1;i<=n;i++)
{
//getchar();
scanf("%s",str);
read(str,table,i);
}
arrange(table,n);
for(int i=1;i<=7;i++)
printf("%c",table[i]);
return 0;
}
void arrange(char* table,int n)
{
for(int k=1;k<=n;k++)
{
int cnt=0;
for(int j=1;j<=7;j++)
{
if(table[j]!='0')
{
for(int i=1;i<=n;i++)
{
if(d1[i]==table[j])
{
if(op[i]=='<')
table[j-num[i]]=d2[i];
else if(op[i]=='>')
table[j+num[i]]=d2[i];
}
else if(d2[i]==table[j])
{
if(op[i]=='<')
table[j+num[i]]=d1[i];
else if(op[i]=='>')
table[j-num[i]]=d1[i];
}
}
}
else cnt+=1;
}
if(cnt==0)break;
}
return;
}