1. 程式人生 > >求解邏輯題誰在說謊?

求解邏輯題誰在說謊?

在礦山網咖休閒時,突然VC++群裡有人問起:

程式設計求解誰在說謊。張三說:"李四說謊。"
李四說:"王五說謊。"
王五說:"張三和李四都在說謊。"
請問:這三個人中誰說的話是真話。

這題還比較有意思,腦子轉動慢的我思考了大半天,得到了一些解決思路:

我們假設張三、李四和王五說話的真假分別由a、b、c來表示,1表示真,0表示假

則三個命題即可表示出來:

1)張三說:“李四說謊”,即可看做 張三是真則李四說謊或張三說謊李四說真即:   (a&&!b)||(!a&&b);

2)   李四說:“王五說謊” ->   (b&&!c)||(!b&&c);

3)   王五說: "張三和李四都在說謊"  -> 王五說真話則張三和李四都在說謊 或 王五說假話則張三李四至少一個說真話即       (c&&(a+b==0))||(!c&&(a+b!=0));

三者之間為 and 關係則我們綜合三個表示式即得到:((a&&!b)||(!a&&b))&&((b&&!c)||(!b&&c))&&((c&&(a+b==0))||(!c&&(a+b!=0)))

我們遍歷 a、b、c的取值情況進行驗證,滿足整個表示式為真的取值即為實際情況。

接下來進行程式設計實現就容易了,然而當時在網咖,也沒有vc++程式設計環境,於是想到用javascript實現。

另外需要注意的是當使用java 或 C#實現時能麻煩一些,我們需要做一些改動。因為這兩個語言不支援 if(1){...}語句,必須為if(true){...},同時bool型變數也不能做加減法運算,這裡不做詳細討論了。

我們看看javascript的實現:順便提一下javascript是寄生於客戶端瀏覽器指令碼程式,我們只要新建一個記事本儲存下邊程式碼,然後將其後綴名改為htm,雙擊開啟,容許禁止的內容即可看到執行結果a:0  b:1  c:0 則說明b說的是真話

<html>

<body>
<script language=javascript>
var a,b,c;
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
{

   if((a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0))
   {
        document.write("a:"+a);
        document.write("<br>b:"+b);
        document.write("<br>c:"+c);
   }
}
</script>
</body>

</html>