(第一篇博文) 今天在一個交流群里見他們無聊,然後找到之前收藏的一些c語言題目放出去想讓他們做,結果反倒是自己不會做,於是花了很多時間去想。 原題:張三說李四在說謊,李四說王五在說謊,王五說張三和李四都在說謊。現在問:這三人中到底誰說的是真話,誰說的是假話? 其實問題本身並不難,只是一開始想多了,陷
(第一篇博文)
今天在一個交流群里見他們無聊,然後找到之前收藏的一些c語言題目放出去想讓他們做,結果反倒是自己不會做,於是花了很多時間去想。
原題:張三說李四在說謊,李四說王五在說謊,王五說張三和李四都在說謊。現在問:這三人中到底誰說的是真話,誰說的是假話?
其實問題本身並不難,只是一開始想多了,陷入死迴圈。
那這個問題的突破口在哪裡呢?
不管誰說謊,每個人都有兩個狀態 真和假
由此,我們就可以確定,我們有迴圈嵌套:
for(var zhangsan=0;zhangsan<=1;zhangsan++) { for(var lisi=0;lisi<=1;lisi++) { for(var wangwu=0;wangwu<=1;wangwu++) {
} } }
這時候,我們只要對zhangsan lisi wangwu 這三個變數進行邏輯判斷即可
邏輯怎麼判斷呢?
根據題目,我們一段一段的分析:
張三說李四在說謊 : 假設zhangsan 就是正確的,那麼有 zhangsan == !lisi
李四說王五在說謊 :同理,有 lisi == !wangwu
王五說張三和李四都在說謊 : 有 wangwu ==((!zhangsan)&&(!lisi))
根據數學帶入解方程的方法,我們其中的兩個兩個相互代入,得到兩個式子,得到:
zhangsan == wangwu
lisi ==((!zhangsan)&&(!lisi))
那我們的結果只要符合上邊兩個要求即可:
if((zhangsan == wangwu)&&(lisi ==((!zhangsan)&&(!lisi))))
最後的結果:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script> for(var zhangsan=0;zhangsan<=1;zhangsan++) { for(var lisi=0;lisi<=1;lisi++) { for(var wangwu=0;wangwu<=1;wangwu++) { if((zhangsan==((!zhangsan)&&(!lisi)))&&(zhangsan==wangwu)) alert("張三:"+zhangsan+" 李四:"+lisi+" 王五:"+wangwu); } } } </script>
ps:雖然說現在做些網站和寫些小軟體是沒問題的,但是由於c# 和 java 都是高級的語言,而且實際使用的時候也很少要這樣判斷邏輯的,
很久不做這些,腦子真的會生鏽的。