A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。因为某种原因,他们是否参赛受到下列条件的约束:
1. 如果A参加,B也参加;
2. 如果C不参加,D也不参加;
3. A和C中只能有一个人参加;
4. B和D中有且仅有一个人参加;
5. D、E、F、G、H 中至少有2人参加;
6. C和G或者都参加,或者都不参加;
7. C、E、G、I中至多只能2人参加
8. 如果E参加,那么F和G也都参加。
9. 如果F参加,G、H就不能参加
10. 如果I、J都不参加,H必须参加
请编程根据这些条件判断这10名同学中参赛者名单。如果有多种可能,则输出所有的可能情况。每种情况占一行。参赛同学按字母升序排列,用空格分隔。
比如:
C D G J
就是一种可能的情况。
多种情况的前后顺序不重要
代码中的思路是使用了条件中的反例
输出结果:
#include<stdio.h> int main(){ int a,b,c,d,e,f,g,h,i,j; for(a=0;a<=1;a++){ for(b=0;b<=1;b++){ if(a==1 && b==0) continue; // 1. 如果A参加,B也参加; for(c=0;c<=1;c++){ if(a+c>1) continue; // 3. A和C中只能有一个人参加; for(d=0;d<=1;d++){ if(b+d!=1) continue; // 4. B和D中有且仅有一个人参加; if(c==0 && d==1) continue; // 2. 如果C不参加,D也不参加; for(e=0;e<=1;e++){ for(f=0;f<=1;f++){ for(g=0;g<=1;g++){ if(c+g==1) continue; // 6. C和G或者都参加,或者都不参加; for(h=0;h<=1;h++){ if(d+e+f+g+h<2) continue; // 5. D、E、F、G、H 中至少有2人参加; if(e==1 && f+g<2) continue; // 8. 如果E参加,那么F和G也都参加。 if(f==1 && g+h>0) continue; // 9. 如果F参加,G、H就不能参加 for(i=0;i<=1;i++){ if(c+e+g+i>2) continue; // 7. C、E、G、I中至多只能2人参加 for(j=0;j<=1;j++){ if(i+j+h==0){ // 10. 如果I、J都不参加,H必须参加 }else{ if(a==1) printf("a "); if(b==1) printf("b "); if(c==1) printf("c "); if(d==1) printf("d "); if(e==1) printf("e "); if(f==1) printf("f "); if(g==1) printf("g "); if(h==1) printf("h "); if(i==1) printf("i "); if(j==1) printf("j "); printf("\n"); } } } } } } } } } } } return 0; }