邏輯思維與C C 解題

2021-07-09 04:25:37 字數 1731 閱讀 8069

考慮這樣一些陳述:

西電有四位同學中的一位做了好事,分別詢問,他們的回答分別是:

- a說:不是我

- b說:是c

- c說:是d

- d說:c胡說

已知四人中三人說了真話,一人說的是假話,請問誰說了謊話,誰做的好事。

通過簡單的規約我們即可獲得答案,b和c有一人說謊,a和d自然說的都是實話,d說:c胡說,則c說慌,c是做好事的人。

我們如何交由計算機實現呢?列舉法,所謂列舉,也即需要在全部可能的空間中進行遍歷判斷。

#include 

int main(int, char**)

; // 重要!整個解空間的定義

int i = 0;

for(; i < 4; i++)

std::cout

<< space[i] << " did the good things"

<< std::endl;

return

0;}

某地刑偵大隊對涉及6個嫌疑人的一樁疑案作如下分析:

這種情況下,可能性較多,人工的方式可能比較費時,如果能充分利用現代計算機的計算能力(辣麼高的主頻),將會給類似問題帶來新的契機。

仍然採用列舉的方式,對整個可能空間進行遍歷式判斷。已知一共六個人,每個人都只有「是罪犯」「不是罪犯」兩種可能,則6個人組成的可能數26

=64:

#include 

#include

int main(int, char**)

; // 中文佔兩個位元組

for (int i = 0; i < pow(2, 6); ++i)

}return

0;}

關於五位選手的排名,各做如下的陳述:

每個人對了一半,錯了一半。請程式設計給出正確的名此。

根據排列組合的知識,我們知五個人排名,所有可能性的個數為:a5

5=120 ,我並沒有構造出合適的for迴圈,控制解空間的大小,無奈暫時只得用五重的for迴圈+if判斷:

int b1, b2, b3, b4, b5;

for (int a = 1; a < 6; ++a)

for (int b = 1; b < 6; ++b)

for (int c = 1; c < 6; ++c)

for (int d = 1; d < 6; ++d)

for(int e = 1; e < 6; ++e)

}}

後來在我晚上跑步的時候,醜陋的五重迴圈始終折磨著我,終於讓我想出了如何用組合a5

5 的形式,完美的解決這一問題,下述的**用到了stl的next_permutation,具體請參閱該函式的相關說明:

#include 

#include // next_permutation

#include

int main(int, char**)

; int b1, b2, b3, b4, b5;

bool flag = true;

while(flag)

flag = std::next_permutation(ranking, ranking+5);

}return

0;}

邏輯思維1

140g鹽,一天平,7g 2g砝碼各乙個,如何只利用這些東西3次把鹽分成50g和90g?這兩天朋友去面試遇到的乙個題,解法如下 1.用7g 2g的砝碼稱出9g鹽,140g 9g 131g 2.用7g 2g砝碼把131g鹽分成兩部分61g,70g 61 2 7 70 3.用2g砝碼和9g鹽把61g鹽分...

邏輯思維4

第348期丨塑造苦難 看來,找到乙個苦難的故事,構建想象的共同體,這是人類共同的本能。虛構的猶太民族 焚書坑儒 第349期丨軟技能 文科素養這個詞,說得也不準確,它的本質是 軟技能 也就是不侷限在某個專業的硬知識,而是著眼於整個社會協作網路和未來社會的複雜性,從確定的東西中把握不確定因素的技能。這才...

邏輯思維訓練

邏輯思維 這個詞,很多人會對它敬而遠之。因為大多人,也包括我在內,我們這些並沒有天生才智的人來說,似乎總認為這是自己不擅長的領域。尤其是對於it行業的人來說,幾乎所有人都會有乙個共識 腦子不行,學不了程式設計。可是我想問,所謂的腦子不行,到底是 不行呢?你可能會覺得,學數學或物理專業的人腦子一定很聰...