01.18 酷叮貓課堂:C語言-誰在說謊問題

酷叮貓課堂:C語言-誰在說謊問題


問題描述

現有張三、李四和王五3個人,張三說李四在說謊,李四說王五在說謊,而王五說張三和李四兩人都在說謊。要求編程求出這3個人中到底誰說的是真話,誰說的是假話。

問題分析

顯然該題是一個邏輯推斷問題。張三、李四和王五3個人都可能說真話,也都可能說假話,那麼如何來判斷他們到底誰在說謊呢?

由問題描述可得到如下3個結論:

由於“張三說李四在說謊”,因此,如果張三說的是真話,則李四就在說謊;反之,如果張三在說謊,則李四說的就是真話。

由於“李四說王五在說謊”,因此,如果李四說的是真話,則王五就在說謊;反之,如果李四在說謊,則王五說的就是真話。

由於“王五說張三和李四兩人都在說謊”,因此,如果王五說的是真話,則張三和李四兩人都在說謊;反之,如果王五在說謊,則張三和李四兩人至少一人說的是真話。

算法設計

該問題同樣可用窮舉法進行解決。

首先將問題分析中得到的3個分析結果用表達式表達出來。用變量x、y和z分別表示張三、李四和王五3人說話真假的情況,當x、y或z的值為1時表示該人說的是真話,值為0時表示該人說的是假話。則問題分析中的3個結論可以使用如下的表達式進行表示:

x==1 && y==0 表示張三說的是真話,李四在說謊;

x==0 && y==1 表示張三在說謊,李四說的是真話;

y==1 && z==0 表示李四說的是真話,王五在說謊;

y==0 && z==1 表示李四在說謊,王五說的是真話;

z==1 && x==0 && y==0 表示王五說的是真話,則張三和李四兩人都在說謊;

z==0 && (x+y)!=0 表示王五在說謊,則張三和李四兩人至少一人說的是真話。

在C語言中,可以使用一個邏輯表達式來表達出一個複雜的關係。將上面的表達式進行整理獲得C語言的表達式如下:

(x&&!y || !x&&y) && (y&&!z || !y&&z) && (z&&x+y==0 || !z&&x+y!=0)

下面是完整的代碼:

#include

int main()

{

int x, y, z;

for(x=0; x<=1; x++)

for(y=0; y<=1; y++)

for(z=0; z<=1; z++)

if( ((x&&!y) || (!x&&y)) && ((y&&!z) || (!y&&z)) && ((z&&x==0&&y==0) || (!z&&x+y!=0)) )

{

printf("張三說的是%s. ",x?"真話":"假話");

printf("李四說的是%s. ",y?"真話":"假話");

printf("王五說的是%s. ",z?"真話":"假話");

}

return 0;

}


分享到:


相關文章: