c语言编程题 求解答怎么做

2024-12-02 10:52:33
推荐回答(1个)
回答(1):

#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;
}