C語言每日一練
2021年1月8日
警察審問4名竊賊嫌疑犯。現在已知,這4人當中僅有一名是竊賊,還知道這4個人中的每個人要麼是誠實的,要麼總是說謊。
這4個人給警察的回答如下。
甲說:「乙沒有偷,是丁偷的。」
乙說:「我沒有偷,是丙偷的。」
丙說:「甲沒有偷,是乙偷的。」
丁說:「我沒有偷。」
請根據這4個人的回答判斷誰是竊賊。
這題的突破口在甲乙丙3個人說的話中,他們的話中都涉及到兩個人,不要糾結他們是否說謊,重點是他們要麼說的是真話,要麼都是假話,所以竊賊一定是他們3個人所提到的「嫌疑人」中的其中一個。(例如:甲說:「乙沒有偷,是丁偷的」——如果他說的是真話,那麼竊賊是丁,如果他說的是假話,那麼竊賊是乙)
根據上面的分析,這道題的答案已經出來了,甲乙丙三個人所說的話中都提到的人就是竊賊——乙。
定義4個變數j
,y
,b
,d
,分別表示甲乙丙丁4個人是否為竊賊,1表示為竊賊。
根據4個人的回答,我們可以得出一下表示式:
y + d == 1
(竊賊要麼是乙,要麼是丁)y + b == 1
(竊賊要麼是乙,要麼是丙)j + y == 1
(竊賊要麼是甲,要麼是乙)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;
}