歡迎點擊「算法與編程之美」↑關注我們!
本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。
歡迎加入團隊圈子!與作者面對面!直接點擊!
問題描述
取球博弈
今盒子裏有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。
我們約定:
每個人從盒子中取出的球的數目必須是:1,3,7,8。
輪到某一方取球時不能棄權!
A先取球,然後雙方交替取球,直到取完。
被迫拿到最後一個球的一方爲負方(輸方)
請編程確定出在雙方都不判斷失誤的情況下,對於特定的初始球數,A是否能贏?
程序運行時,從標準輸入獲得數據,其格式如下:
先是一個整數n(n<100),表示接下來有n個整數。然後是n個整數,每個佔一行(整數<10000),表示初始球數。
程序則輸出n行,表示A的輸贏情況(輸爲0,贏爲1)。
例如,用戶輸入:
4
1
2
10
18
則程序應該輸出:
0
1
1
0
解決方案
注意‘兩人都很聰明,不會做出錯誤的判斷’這段話。
意思是當A和B面臨選擇時,如果他們的選擇能使對方輸(不管對方怎麼選擇,結果都是輸),那麼他們就一定會這樣選擇。
所以,這可能就是一個找規律的題型,在一定範圍內具有某種規律,之後不停地重複這種規律。因爲球數多了 A先選就會把情況變成之前的某一種情況。
我們試一試:
次數輸贏(輸 0 贏 1)
1 0
2 1
3 0
4 1
5 0
6 1
7 0
8 1
9 1
10 1
11 1
12 1
13 1
14 1
15 1
16 0
17 1
18 0
19 1
不難看出這是以15爲一個循環的,1到8是輸贏交替,9到15都是贏。接下來寫代碼便容易了很多。
編寫代碼:
n = int(input('多少個開始球數的情況:')) l = list(i for i in range(n)) for i in range(n): l[i] = int(input()) def qiuqiu(m): mm = m % 15 if mm > 7: print(1) else: if mm % 2 == 0: print(1) else: print(0) for i in l: qiuqiu(i |
END
實習編輯 | 王文星
責 編 | 周茂林
where2go 團隊
微信號:算法與編程之美
長按識別二維碼關注我們!
溫馨提示:點擊頁面右下角“寫留言”發表評論,期待您的參與!期待您的轉發!