51.誰(shuí)是竊賊
公安人員審問(wèn)四名竊賊嫌疑犯。已知,這四人當(dāng)中僅有一名是竊賊,還知道這四人中每人要么是誠(chéng)實(shí)的,要么總是說(shuō)謊的。在回答公安人員的問(wèn)題中:
甲說(shuō):“乙沒(méi)有偷,是丁偷的?!?BR> 乙說(shuō):“我沒(méi)有偷,是丙便的。”
丙說(shuō):“甲沒(méi)有偷,是乙偷的?!?BR> 丁說(shuō):“我沒(méi)有偷。”
請(qǐng)根據(jù)這四人的答話判斷誰(shuí)是盜竊者。
*問(wèn)題分析與算法設(shè)計(jì)
假設(shè)A、B、C、D分別代表四個(gè)人,變量的值為1代表該人是竊賤。
由題目已知:四人中僅有一名是竊賤,且這四個(gè)人中的每個(gè)人要么說(shuō)真話,要么說(shuō)假話,而由于甲、乙、丙三人都說(shuō)了兩句話:“X沒(méi)偷,X偷了”,故不論該人是否說(shuō)謊,他提到的兩人中必有一人是小偷。故在列條件表達(dá)式時(shí),可以不關(guān)心誰(shuí)說(shuō)謊,誰(shuí)說(shuō)實(shí)話。這樣,可以列出下列條件表達(dá)式:
甲說(shuō):”乙沒(méi)有偷,是丁偷的?!?B+D=1
乙說(shuō):“我沒(méi)有偷,是丙偷有。” B+C=1
丙說(shuō):“甲沒(méi)有偷,是乙偷的?!?A+B=1
丁說(shuō):“我沒(méi)有偷。” A+B+C+D=1
其中丁只說(shuō)了一句話,無(wú)法判定其真假,表達(dá)式反映了四人中僅有一名是竊賤的條件。
*程序與程序注釋
#include
void main()
{
int i,j,a[4];
for(i=0;i<4;i++) /*假定只有第i個(gè)人為竊賤*/
{
for(j=0;j<4;j++) /*將第i個(gè)人設(shè)置為1表示竊賤,其余為0*/
if(j==i)a[j]=1;
else a[j]=0;
if(a[3]+a[1]==1&&a[1]+a[2]==1&&a[0]+a[1]==1) /*判斷條件是否成立*/
{
printf("The thief is "); /*成立*/
for(j=0;j<=3;j++) /*輸出計(jì)算結(jié)果*/
if(a[j])printf("%c.",j+’A’);
printf("\n");
}
}
}
*運(yùn)行結(jié)果
The thief is B. (乙為竊賤。)
公安人員審問(wèn)四名竊賊嫌疑犯。已知,這四人當(dāng)中僅有一名是竊賊,還知道這四人中每人要么是誠(chéng)實(shí)的,要么總是說(shuō)謊的。在回答公安人員的問(wèn)題中:
甲說(shuō):“乙沒(méi)有偷,是丁偷的?!?BR> 乙說(shuō):“我沒(méi)有偷,是丙便的。”
丙說(shuō):“甲沒(méi)有偷,是乙偷的?!?BR> 丁說(shuō):“我沒(méi)有偷。”
請(qǐng)根據(jù)這四人的答話判斷誰(shuí)是盜竊者。
*問(wèn)題分析與算法設(shè)計(jì)
假設(shè)A、B、C、D分別代表四個(gè)人,變量的值為1代表該人是竊賤。
由題目已知:四人中僅有一名是竊賤,且這四個(gè)人中的每個(gè)人要么說(shuō)真話,要么說(shuō)假話,而由于甲、乙、丙三人都說(shuō)了兩句話:“X沒(méi)偷,X偷了”,故不論該人是否說(shuō)謊,他提到的兩人中必有一人是小偷。故在列條件表達(dá)式時(shí),可以不關(guān)心誰(shuí)說(shuō)謊,誰(shuí)說(shuō)實(shí)話。這樣,可以列出下列條件表達(dá)式:
甲說(shuō):”乙沒(méi)有偷,是丁偷的?!?B+D=1
乙說(shuō):“我沒(méi)有偷,是丙偷有。” B+C=1
丙說(shuō):“甲沒(méi)有偷,是乙偷的?!?A+B=1
丁說(shuō):“我沒(méi)有偷。” A+B+C+D=1
其中丁只說(shuō)了一句話,無(wú)法判定其真假,表達(dá)式反映了四人中僅有一名是竊賤的條件。
*程序與程序注釋
#include
void main()
{
int i,j,a[4];
for(i=0;i<4;i++) /*假定只有第i個(gè)人為竊賤*/
{
for(j=0;j<4;j++) /*將第i個(gè)人設(shè)置為1表示竊賤,其余為0*/
if(j==i)a[j]=1;
else a[j]=0;
if(a[3]+a[1]==1&&a[1]+a[2]==1&&a[0]+a[1]==1) /*判斷條件是否成立*/
{
printf("The thief is "); /*成立*/
for(j=0;j<=3;j++) /*輸出計(jì)算結(jié)果*/
if(a[j])printf("%c.",j+’A’);
printf("\n");
}
}
}
*運(yùn)行結(jié)果
The thief is B. (乙為竊賤。)

