問題描述
現有張三、李四和王五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;
}