考慮這樣一些陳述:
西電有四位同學中的一位做了好事,分別詢問,他們的回答分別是:
- 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行業的人來說,幾乎所有人都會有乙個共識 腦子不行,學不了程式設計。可是我想問,所謂的腦子不行,到底是 不行呢?你可能會覺得,學數學或物理專業的人腦子一定很聰...