打卡5.5

1.问题描述

警察审问4名窃贼嫌疑犯。现在已知,这4人当中仅有一名是窃贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎。

这四个人回答如下

甲:乙没有偷,是丁偷的

乙:我没有偷,是丙偷的

丙:甲没有偷,是乙偷的

丁:我没有偷

请根据这四个人的回答判断谁是窃贼

2.问题分析

四个人里面有一个窃贼,丁说自己没有偷,这个不能看出什么来,只能从前三个人入手。用ABCD分别代表四个人,变量值为1代表这个人是窃贼,根据题可以列出条件

B+D=1

B+C=1

A+B=1

A+B+C+D=1//这个丁说的话什么也看不出来,只知道四个人有一个是窃贼

3.算法设计

要三个表达式同时成立,也就是说B+D==1&&B+C==1&&A+B==1

如果A是窃贼,那么A=1,B=C=D=0,然后带入上面的表达式,如果成立就不用测试了

假如不成立,就假设B是窃贼,就是A=C=D=0,B=1,如果成立,B就是窃贼,如果不成立就假设C为窃贼........一直试下去

4.程序

复制代码
#include<iostream>
using namespace std;
int main()
{
    int i, A = 1, B = 0, C = 0, D = 0;//这里先假设A是窃贼
    for (i = 1; i <= 4; i++)
        if (B + D == 1 && B + C == 1 && A + B == 1)//判断符合条件的,如果符合就是窃贼
            break;
        else
        {
            if (i == 1)//第一次就试出来了,甲不是窃贼,判断乙是不是
            {
                A = 0; B = 1;
            }
            if (i == 2)//这里甲乙都不是,测试丙是不是
            {
                B = 0; C = 1;
            }
            if (i == 3)//甲乙丙都不是,测试丁是不是
            {
                C = 0; D = 1;
            }
        }
    if (i == 1)
        cout << "甲" << endl;
    if (i == 2)
        cout << "乙" << endl;
    if (i == 3)
        cout << "丙" << endl;
    if (i == 4)
    {
        cout << "丁" << endl;
    }
    return 0;
}
posted @ 2023-05-14 18:56  /张根源/  阅读(11)  评论(0编辑  收藏  举报