此題有個先決條件

就是並非犯人你看我我看你

從黎明看到黃昏

而是大家各看一眼

就各自回房睡覺

明天大家再各看一眼

再各自回房睡覺

 

首先,我們可以分成以下幾種情形

(W: 戴白帽心裡想的話, R: 戴紅帽的心裡想的話)

 

1.紅帽少於人數 

 

(1)只有1頂紅帽

day1

R: YA, 大家都白帽,那我一定是紅帽,等會出獄囉~~~

W: 紅帽一個,我是白還是紅啊???

 

day2

W: 昨天那個戴紅帽的憑什麼敢走??

     阿,因為我戴白帽

 

於是第二天,囚犯都出獄了QQ

 

(2)有2頂紅帽

day1

R:紅帽一個,我是白還是紅啊???

W:紅帽二個,我是白還是紅啊???

 

day2

R:戴紅帽的你幹嘛不走啊?

   阿! 我懂了,因為我也是紅帽

W:紅帽二個怎麼都不走,你們在打探對方齁

     現在清楚了,等等就滾吧

 

於是第三天,囚犯都出獄了QQ

 

day3

W: 果然滾了,那麼我一定是白帽

 

(3)紅帽有3個

day1

R:紅帽二個,我是白還是紅啊???

W:紅帽三個,我是白還是紅啊???

 

day2

R:紅帽二個怎麼都不走,你們在打探對方齁

     現在清楚了,等等就滾吧

W:紅帽三個,我是白還是紅啊???

 

 

 

day3

R:誒??怎麼不滾,莫非有第3個紅帽

  其他人都白帽,那就是我囉!!!

W:紅帽三個怎麼都不走,你們在打探對方齁

     現在清楚了,等等就滾吧

 

day4

W: 果然滾了,那麼我一定是白帽

 

於是第四天,囚犯都出獄了QQ

 

從以上三個例子

我們可以推出2個結論

1.n頂紅帽n+1天走

2.紅帽先走(第n天),白帽隔天走(第n+1天), 且同色帽子一起走

 

2.紅帽等於人數

 

假設有 n人

 

R: 天啊,大家都是紅帽

   我是紅帽還是白帽??

   不知道ㄝ,但我有看上面解說

   那我等n天好了

 

於是,日子一天一天過去了,囚犯人數依然不變......

直到

day n

R:終於等到這天了

   看來我必定是紅帽

   大家越獄吧 ?!

 

於是第n天,囚犯都出獄了QQ

 

以下是期待已久的解答

 

迴圈

輸入

若紅帽 != 人數

輸出紅帽+1天

若紅帽 == 人數

輸出紅帽天 (就是天數 == 紅帽數)

 

#include <iostream>

using namespace std;

int main()
{

    unsigned int people, hat;
    while(cin>> people >>hat)
        cout<< hat+(people!=hat) <<endl;
        
    return 0;
}

arrow
arrow
    全站熱搜

    大神(偽) 發表在 痞客邦 留言(0) 人氣()