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
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<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using namespace std;
int cont[10]; //cont数组由0,1表示人员参加比赛情况
int IsCan(){ //依次判断 条件是否满足
if(cont[0]==1){
if(cont[1]==0){
return 0;
}
}
if(cont[2]==0){
if(cont[3]==1){
return 0;
}
}
if(cont[0]==1 && cont[2]==1) return 0;
if(cont[1]==1 && cont[3]==1 || cont[1]==0 && cont[3]==0) return 0;
int sum=0;
for(int i=3;i<=7;i++){
sum+=cont[i];
}
if(sum<2) return 0;
if((cont[2]==1 && cont[6]==0) || (cont[2]==0 && cont[6]==1)) return 0;
int sum1=0;
sum1=cont[2]+cont[4]+cont[6]+cont[8];
if(sum1>2) return 0;
if(cont[4]==1){
if(cont[5]==0 || cont[6]==0) return 0;
}
if(cont[5]==1){
if(cont[6]==1 || cont[7]==1) return 0;
}
if(cont[8]==0 && cont[9]==0){
if(cont[7]==0) return 0;
}
return 1;
}
void dfs(int cur){
if(cur==10){
if(IsCan()){
for(int i=0;i<10;i++){
if(cont[i]!=0)
printf("%c ",'A'+i);
}
printf("\n");
}
return ;
}
for(int i=0;i<=1;i++){
cont[cur]=i;
dfs(cur+1);
}
}
int main(){
dfs(0);
}
C D G J
C D G H
C D G H J
B C G H
B C G H J