邮你 2022-04-24 15:31 采纳率: 66.7%
浏览 90
已结题

关于#c语言#破案的问题,如何解决?

一位法官在审理一起盗窃案时,对涉及的4名嫌疑犯A、B、C、D进行了审问。4人分别供述如下: A:“罪犯在B、C、D三人之中。” B:“我没有作案,是C偷的。” C:“在A和D中间有一个是罪犯。” D:“B说的是事实。” 经过充分的调查,证实4人中只有两人说了真话,另外两人说的是假话,并且罪犯只有一个。请确定真正的罪犯。 **输出格式要求:"4个%d,\n" "A是罪犯.\n" "B是罪犯.\n" "C是罪犯.\n" "D是罪犯.\n" 说明:ABCD只能有一个是罪犯,输出的四个整数为0或1,分别代表ABCD是罪犯,如假设程序输出为: 1,0,0,0 <===此输出代表A是罪犯,B、C、D不是罪犯 A是罪犯. <===用文字解释上面的含义,程序输出必须有这两行

  • 写回答

1条回答 默认 最新

  • aabyte 2022-04-24 17:05
    关注

    思路见代码里注释:

    #include <stdio.h>
    int main(void)
    {
        int A = 0,B = 0,C = 0,D = 0;
        //A,B,C,D代表四个人,如果值为 0代表不是罪犯,为 1代表是罪犯
        /*
        A,B,C,D四个人的供述转换为程序语言,即:
        A :  B == 1 || C == 1 || D == 1    罪犯在BCD三人之中
        B :  B == 0 && C == 1              B没有作案,是C偷的
        C :  A == 1 || D == 1AD中间有一个是罪犯
        D :  B == 0 && C == 1              B说的是事实
    
        题目还给出两个条件:
        条件1  A,B,C,D中两个人说真话,两个人说假话,而 BD的供述是一样的
            所以只有两种情况:
            情况1  AC说的是真的  BD说的是假的
            情况2  AC说的是假的  BD说的是真的
        条件2   A,B,C,D只有一个人是罪犯,转换为程序语言: A + B + C + D == 1
        */
        for(A = 0; A <= 1; A ++)
        {
            for(B = 0; B <= 1; B ++)
            {
                for(C = 0; C <= 1; C ++)
                {
                    for(D = 0; D <= 1; D ++) //枚举A,B,C,D所有的取值情况
                    {
                        //情况一
                        if(B == 1 || C == 1 || D == 1 ) //如果 A 说的是真话
                            if(A == 1 || D == 1) //并且 C 说的是真话
                                if(!(B == 0 && C == 1)) //并且 BD 说的是假话
                                    if(A + B + C + D == 1) //并且A,B,C,D中只有一个是罪犯
                                        printf("%d %d %d %d\n",A,B,C,D);
                        //情况二
                        if(B == 0 && C == 1) //如果 BD 说的是真话
                            if(!(B == 1 || C == 1 || D == 1 )) //并且 A说的是假话
                                if(!(A == 1 || D == 1)) //并且 C说的是假话
                                    if(A + B + C + D == 1) //并且A,B,C,D中只有一个是罪犯
                                        printf("%d %d %d %d\n",A,B,C,D);
                    }
                }
            }
        }
    
        return 0;
    }
    

    运行结果:

    img

    即 D 是罪犯,A,B,C不是, A,C说的真话,B,D说的假话

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月2日
  • 已采纳回答 4月24日
  • 创建了问题 4月24日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么