Python 有趣的囚犯问题
生活随笔
收集整理的這篇文章主要介紹了
Python 有趣的囚犯问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一個監(jiān)獄中有n個囚犯,每個犯人一個單獨的房間,犯人之間不能進行通訊。
監(jiān)獄規(guī)定每天可以有一個犯人出來放風(fēng),并且犯人在往返住所的過程中不能和其他犯人進行聯(lián)系。
放風(fēng)的操場上有一盞燈,犯人可以隨意的進行開閉。
一天監(jiān)獄長對犯人們說:“如果你們每個人都至少放風(fēng)一次,并向我匯報,我可以放你們出去,但是如果你們說謊的話,你們將永遠待下去"
監(jiān)獄長給犯人10分鐘的討論時間。
問題:使用程序來實現(xiàn)確保每一個犯人都放風(fēng)了。
解題思路:
因為操場有一盞燈,所以,可以找一個犯人隊長,來記錄放風(fēng)的人。
隊長僅僅負(fù)責(zé)關(guān)燈,其他犯人負(fù)責(zé)開燈。
當(dāng)隊長關(guān)一次燈就記錄一次
其他犯人僅僅開一次燈,(比如第一次出來開燈,第二次再出來就不要開燈了)
當(dāng)隊長再次出來發(fā)現(xiàn)燈不再亮,那么同樣也就確定了犯人的數(shù)量。
# -*- coding:utf-8 -*- import numpy as np#---------------------------------------------------------------------- def prison(prisoners): turn_on = [False] * prisoners # 設(shè)置開燈的次數(shù)monitor = prisoners - 1 # 將班長從犯人的數(shù)量中去除num = 1 # 定義計數(shù)器lamp = False # 剛開始的等是關(guān)閉的while num < prisoners: # 如果記載的數(shù)量小于每個犯人的數(shù)量lamp,num = select(prisoners,monitor,turn_on,lamp,num) print("All prisoners get free") #---------------------------------------------------------------------- def select(prisoners,monitor,turn_on,lamp,num):luck = np.random.randint(0,prisoners) # 定義隨機開燈的人print("luck",luck)if luck == monitor: # 如果放風(fēng)的人是班長,開始判斷燈是否是亮的,如果燈是亮的,則計數(shù)器+1,并將燈關(guān)掉if lamp:num += 1lamp = Falseelse: # 如果放風(fēng)的不是班長,并且燈是滅的,則將燈開啟,如果燈是亮的則不管if not lamp:if not turn_on[luck]:lamp = Trueturn_on[luck] == Truereturn lamp,num if __name__ == "__main__":prison(4) # 假設(shè)總共有四個犯人
總結(jié)
以上是生活随笔為你收集整理的Python 有趣的囚犯问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能监狱
- 下一篇: 51nod 1299 监狱逃离 树形dp