#include
/*
1.A和B中至少一人获奖;
2.A,C,D中至少两人获奖;
3.A,E中至多一人获奖;
4.B和F或者同时获奖,或者都未获奖;
5.C和E的获奖情况也相同;
6.如果E未获奖,则F也不可能获奖;
7.C,D,E,F中至多三人获奖。
用flag数组表示获奖状态,1表示获奖,0表示没获奖,下标与对应的人的关系如下
0 1 2 3 4 5
A B C D E F
*/
int flag[6];
bool check(){
int cnt;
//1 A B都未获奖,返回0
if(!flag[0] && !flag[1])return 0;
//2 ACD中获奖数小于2,返回0
cnt = 0;
if(flag[0])cnt++;
if(flag[2])cnt++;
if(flag[3])cnt++;
if(cnt < 2)return 0;
//3 AE都获奖,返回0
cnt = 0;
if(flag[0] && flag[4])return 0;
//4 B和F的获奖情况不一样,返回0
if(!flag[1] && flag[5])return 0;
if(flag[1] && !flag[5])return 0;
//5 C和E的获奖情况不一样,返回0
if(!flag[2] && flag[4])return 0;
if(flag[2] && !flag[4])return 0;
//6 E未获奖,F获奖 返回0
if(!flag[4] && flag[5])return 0;
//7 CDEF中获奖人数大于3,返回0
cnt = 0;
for(int i = 2; i <= 5; ++i)if(flag[i])cnt ++;
if(cnt > 3)return 0;
//其余情况符合条件,返回1
return 1;
}
int main(){
//枚举所有可能的获奖情况,共有2^6种
bool mark = 0;
int i,j;
for(i = 0; i < 64; ++i){
int t = i;
for(j = 0; j < 6; ++j){
flag[j] = t%2;
t /= 2;
}
if(check()){
printf("找到可行解:\n");
mark = 1;
for(j = 0; j < 6; ++j){
if(flag[j])printf("%c获奖\n",'A'+j);
}
puts("");
}
}
if(!mark)puts("未找到可行解!");
return 0;
}