医院有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
DB2
B>G4
FC1
F=4
输出样例:
EDBFCAG
#include<bits/stdc++.h>
using namespace std;
struct node{
char a;
char c;
char fu;
int t;
int f;
};
node zhi[100];
char pai[8];
vector<char>v;
int main(){
int n;
cin>>n;
int t=0;
int t1=0;getchar();
for(int i=0;i<n;i++){
char a,b,c;
int d;
string s;
getline(cin,s);
a=s[0];
b=s[1];
// cout<<s<<endl;
if(b=='='){
d=s[2]-'0';
pai[d-1]=a;
t1++;continue;
//v.push_back(a);
}
c=s[2];
d=s[3]-'0';
if(b=='>'){
zhi[t].a=a;
zhi[t].fu=b;
zhi[t].c=c;
zhi[t].t=d;
zhi[t++].f=0;}
else {
zhi[t].a=c;
zhi[t].fu='>';
zhi[t].c=a;
zhi[t].t=d;
zhi[t++].f=0;
}
// cout<<a<<b<<c<<d<<endl;
}
int k=t;
while(k--){
for(int i=0;i<t;i++){
//cout<<i<<": ";
if(zhi[i].f==0){
for(int j=0;j<7;j++){
if(pai[j]==zhi[i].a){
//cout<<" "<<j;
int c=zhi[i].t;
if(c+j<7) pai[(c+j)]=zhi[i].c;
else pai[(c+j)%7]=zhi[i].c;
//cout<<(c+j)%7<<endl;
zhi[i].f=1;
}
if(pai[j]==zhi[i].c){
int c=zhi[i].t;
pai[(j-c+7)%7]=zhi[i].a;
zhi[i].f=1;
// cout<<(j-c+7)%7<<endl;
}
/*for(int i=0;i<7;i++){
cout<<pai[i]<<" ";
}cout<<endl;*/
}
}
}
}
for(int i=0;i<7;i++){
cout<<pai[i];
}
}