求解邏輯題誰在說謊?
在礦山網咖休閒時,突然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>