4

C语言每日一练——第73天:谁是窃贼问题

 2 years ago
source link: https://blog.csdn.net/weixin_43772810/article/details/122379032
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C语言每日一练——第73天:谁是窃贼问题

小辉_Super 2022-01-08 14:53:51 4661
分类专栏: # 每日一练C 文章标签: c语言
专栏收录该内容
74 篇文章 1169 订阅

C语言每日一练
2021年1月8日

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

这4个人给警察的回答如下。

甲说:“乙没有偷,是丁偷的。”
乙说:“我没有偷,是丙偷的。”
丙说:“甲没有偷,是乙偷的。”
丁说:“我没有偷。”

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

这题的突破口在甲乙丙3个人说的话中,他们的话中都涉及到两个人,不要纠结他们是否说谎,重点是他们要么说的是真话,要么都是假话,所以窃贼一定是他们3个人所提到的“嫌疑人”中的其中一个。(例如:甲说:“乙没有偷,是丁偷的”——如果他说的是真话,那么窃贼是丁,如果他说的是假话,那么窃贼是乙)

根据上面的分析,这道题的答案已经出来了,甲乙丙三个人所说的话中都提到的人就是窃贼——乙。

定义4个变量j,y,b,d,分别表示甲乙丙丁4个人是否为窃贼,1表示为窃贼。

根据4个人的回答,我们可以得出一下表达式:

  1. 甲说:“乙没有偷,是丁偷的。”——y + d == 1 (窃贼要么是乙,要么是丁)
  2. 乙说:“我没有偷,是丙偷的。”——y + b == 1 (窃贼要么是乙,要么是丙)
  3. 丙说:“甲没有偷,是乙偷的。”——j + y == 1 (窃贼要么是甲,要么是乙)
  4. 丁说:“我没有偷。”——j + y + b == 1 || j == 1(窃贼只有一个)
#include <stdio.h>

int main()
{
    //甲乙丙丁是否为窃贼,1表示为窃贼
    int j = 0, y = 0, b = 0, d = 0;

    for(j = 0; j <= 1; j++)
        for(y = 0; y <= 1; y++)
            for(b = 0; b <= 1; b++)
                for(d = 0; d <= 1; d++)
                    if(y + d == 1 && y + b == 1 &&\
                            j + y == 1 && j + y + b + d == 1)
                    {
                        if(j)
                            printf("甲是窃贼\n");
                        else if(y)
                            printf("乙是窃贼\n");
                        else if(b)
                            printf("丙是窃贼\n");
                        else
                            printf("丁是窃贼\n");
                    }
    return 0;
}

在这里插入图片描述

原文链接:http://c.biancheng.net/cpp/html/3351.html
特点:由于只有一个人是窃贼,所以只需要用一个for循环。

#include<stdio.h>
int main()
{
    int i, A=1, B=0, C=0, D=0;  /*先假定甲是窃贼*/
    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;
            }
        }
    /*输出结果*/
    printf("判断结果:\n");
    if(i == 1)
        printf("甲是窃贼\n");
    if(i == 2)
        printf("乙是窃贼\n");
    if(i == 3)
        printf("丙是窃贼\n");
    if(i == 4)
        printf("丁是窃贼\n");
   
    return 0;
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK