C語言每日一練——第73天:誰是竊賊問題

2022-01-08 22:00:27

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