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

 我来答
物理公司的
2015-11-12 · TA获得超过5697个赞
知道大有可为答主
回答量:6105
采纳率:86%
帮助的人:1380万
展开全部
#include <stdio.h>
/*
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;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式