题目描述
5位选手参加100米决赛,教练员让5人据实力预测比赛结果。
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
决赛结果公布后,每位选手的预测都只说对了一半(即一对一错)。判断每位选手比赛实际名次与输入的猜测是否相同。
特别说明:不是电脑判断出解,直接输出结果不计分。
输入
测试数据组数
每组测试数据一行,随机的选手排名
输出
对每组测试数据,如果选手排名与决赛结果公布的选手排名一致,输出YES;否则输出NO
#include<stdio.h>
int main()
{ int t,A,B,C,D,E,A1,B1,C1,D1,E1,sqe,i;
char ch;
for(A=1;A<=5;A++){for(B=1;B<=5;B++){for(C=1;C<=5;C++){for(D=1;D<=5;D++){for(E=1;E<=5;E++){
if( (B == 2) + (A == 3) == 1 &&(B == 2) + (E == 4) == 1 &&(C == 1) + (D == 2) == 1 &&(C == 5) + (D == 3) == 1 &&(E == 4) + (A == 1) == 1 &&A*B*C*D*E==120)//这里要学习多个2选1的条件如何构造 同时不要忘了隐含条件的挖掘
goto out;//使用goto使代码更有观赏性
}}}}}
out:
scanf("%d",&t);
for(i=0;i<t;i++) {
sqe = 1;//第一个输出的就记为1
while ((ch = getchar()) != '\n') {
if (ch != ' ') {//第一次不小心用成了循环,其实要用选择。
switch (ch) {
case'A':A1 = sqe;
break;
case'B':B1 = sqe;
break;
case'C':C1 = sqe;
break;
case'D':D1 = sqe;
break;
case'E':E1 = sqe;
break;
}
sqe++;
}
}
if (A1 == A && B1 == B && C1 == C && D1 == D && E1 == E) {
printf("YES\n");//采用的是整体的判别 而不是单个的从前往后的一个一个的判断
} else {
printf("NO\n");
}
}
}