/*
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;
}