今盒子裡有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
分析:定義flag存放最終陪你過輸出結果,初始值都為0,b存放一次可以取的個數,即1,3,7,8,a接受原始輸入的n個數,在接收輸入資料的同時求出n個數中的最大數賦給變數max。從2開始迴圈,一一判斷。判斷flag[i]時,可以根據flag[i-b[j]]來求得flag[i].
2.3.4,5,6......,max
假定flag[i-b[j]]為0,最終結果flag[i] = 1,表明a取勝。由於a先取數,讓a第一次先選擇b[i]個球,這時剩下i-b[j]個球,根據flag[i-b[j]]的值即可判斷a是輸是贏 。因為對於i-b[j]個球無論怎樣取的結果已經求出,若a輸了,那此時b先取球(相當於a與b交換下順序),所以b輸時,那麼a就是贏的,flag[i] = 1.
而flag[i-b[j]]為1,推理過程與上面一樣,flag[i] = 0.
程式**如下:
#include int main()
; int flag[10001] = ;
int n;
int max = 0;
int i,j;
scanf ("%d",&n);
for (i=0; imax)
}for (i=2; i<=max; i++)
{ for (j=0; j<4&&b[j]
java藍橋杯 取球問題
問題 今盒子裡有n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定 每個人從盒子中取出的球的數目必須是 1,3,7或者8個。輪到某一方取球時不能棄權!a先取球,然後雙方交替取球,直到取完。被迫拿到最後乙個...
藍橋杯取球博弈
題目 取球博弈 兩個人玩取球的遊戲。一共有n個球,每人輪流取球,每次可取集合中的任何乙個數目。如果無法繼續取球,則遊戲結束。此時,持有奇數個球的一方獲勝。如果兩人都是奇數,則為平局。假設雙方都採用最聰明的取法,第乙個取球的人一定能贏嗎?試程式設計解決這個問題。輸入格式 第一行3個正整數n1 n2 n...
藍橋杯 取球博弈
取球博弈 今盒子裡有n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定 每個人從盒子中取出的球的數目必須是 1,3,7或者8個。輪到某一方取球時不能棄權!a先取球,然後雙方交替取球,直到取完。被迫拿到最後...