列舉法用於邏輯問題的處理

2021-09-21 17:30:03 字數 1886 閱讀 6865

遇到一些邏輯問題的時候,因為資料量不大的關係,我們通常只是需要人工列舉出所有的情況就可以。今天發現了怎麼用計算機去列舉,況且記錄一波。

問題 1:

警察局抓了a,b,c,d四名偷竊嫌疑犯,其中有一人是小偷。審問中:

a說:「我不是小偷」。

b說:「c是小偷」。

c說:「小偷肯定是d」。

d說:「c冤枉人」。

現在已經知道四人中三人說的是真話,一人說的是假話。問到底誰是小偷?

分析

問題只有4中情況,而且他們4個人說的話只有4句為真。假設小偷為x,他們四個人說的話可以轉換為以下四條邏輯表示式:

接下來就只需要列舉x可取的四個值,滿足上面三條邏輯表示式有三條為真的情況就得到了正解

**如下

#

include

#include

using namespace std;

intmain()

問題 2:

3位老師對某次數學競賽進行**,他們的**為:

甲說: 學生a得第一名,學生b得第三名

乙說:學生c得第一名,學生d得第四名

丙說:學生d得第二名,學生a得第三名。

競賽結果表明,他們都說對一半,說錯一半,且無並列名次,試編寫程式a,b,c,d各自的名稱。

分析

如果不除去並列名次,則有4

44^4

44種情況,人工列舉會稍顯麻煩。我們還是可以按照上一題的思想進行列舉。

假設a,b,c,d分別表示學生a,學生b,學生c和學生d所獲得的名次,那麼三位教練說的話可以可以用如下邏輯表示式表示:

由於他們說的話都只有一半是對的,所以我們可以得到以下條件句:

**如下

#

include

#include

using namespace std;

intmain()

}}}return0;

}

問題描述

公安人員審問甲、乙、丙、丁四個嫌疑犯,已確知,這四個人當中僅有一人是偷竊者,還知道這四個人的答話,要麼完全誠實,要麼完全說謊。在回答公安人員的問話中:

甲說:「乙沒有偷,是丁偷的。」

乙說:「我沒有偷,是丙偷的。」

丙說:「甲沒有偷,是乙偷的。」

丁說:「我沒有偷,我用的那東西是我家裡的。」

請根據上述四人答話,判斷誰是偷竊者。

輸入格式

輸出格式

輸出乙個字元,表示偷竊者是誰,a表示甲,b表示乙,c表示丙,d表示丁。

分析

因為甲乙丙說的話都包含兩個部分,而且他們說的話要麼全為真,要麼全為假。(至於丁說的話對結果有沒有影響,我還有點疑問)就可得以下條件句:

**如下

#

include

#include

#define

x1(x!=

'b')

+(x==

'd')

#define

x2(x!=

'b')

+(x==

'c')

#define

x3(x!=

'a')

+(x==

'b')

using namespace std;

intmain()

異常不可用於邏輯處理

異常是錯誤處理,但是不可以用於邏輯處理,假設我們封裝了乙個msgqueue,這個類負責收集由服務端一條接受執行緒收集客戶端訊息,另一條工作執行緒負責取出訊息,並對訊息進行處理。class msg class msgqueue 這裡定義了msgqueue的兩個方式,分別是收集客戶端訊息,然後儲存訊息的...

POJ熄燈問題(列舉法)

題目 有乙個由按鈕組成的矩陣,其中每行有6個按鈕,共5行。每個按鈕的位置上有一盞燈。當按下乙個按鈕後,該按鈕以及周圍位置 上邊 下邊 左邊 右邊 的燈都會改變一次。即,如果燈原來是點亮的,就會被熄滅 如果燈原來是熄滅的,則會被點亮。在矩陣角上的按鈕改變3盞燈的狀態 在矩陣邊上的按鈕改變4盞燈的狀態 ...

用列舉法解決簡單的問題

有了迴圈控制結構,就可以實現一種典型的解決問題的方法 列舉法。列舉法就是對可能是解的眾多候選者按某種順序進行逐一列舉和檢驗,從中找出符合要求的候選解作為問題的解。乙個關於我國四大湖的問題 四個同學有以下表述 甲 洞庭湖最大,洪澤湖最小,潘陽湖第三。乙 洪澤湖最大,洞庭湖最小,潘陽湖第 二 太湖第三。...