藍橋杯 取球遊戲(博弈)

2021-07-30 05:32:32 字數 991 閱讀 2079

今盒子裡有n個小球,a、b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。

我們約定:

每個人從盒子中取出的球的數目必須是:1,3,7或者8個。

輪到某一方取球時不能棄權!

a先取球,然後雙方交替取球,直到取完。

被迫拿到最後乙個球的一方為負方(輸方)

請程式設計確定出在雙方都不判斷失誤的情況下,對於特定的初始球數,a是否能贏?

首先是乙個整數n(n<100),表示接下來有n個整數。然後是n個整數,每個佔一行(整數<10000),表示初始球數。

輸出n行,表示a的輸贏情況(輸為0,贏為1)

412

1018

011

0

解題思路:這個題我發現了乙個規律,初始球是從小到大開始計算,前四個球的時候直接初始化,之後的例如初始球為5的時候a可能取得情況為乙個或者三個,當取乙個的時候b取得情況也有兩種1.b取乙個的時候,這個時候剩下三個,則三個和初始球為三的時候的情況是一樣的,所以可以直接得到這個時候的誰輸誰贏,2.b取三個的時候,這個時候剩下乙個,這乙個和初始球為1的時候的情況是一樣的。因為b不會做出錯誤的判斷,所以這個時候只有當b取球之後判斷的結果都為輸的時候a才會贏。同理a取三個的時候也是這樣來計算。也就是說對於任何情況,首先讓a取一次,然後再讓b取一次,這個時候剩下的球的數量可以根據之前計算得出結果,然後遞推;

#include#include#includeint vis[20000];

int ff(int x)

int main()

scanf("%d",&l);

while(l--)

return 0;

}

當然也有乙個簡單的方法,如果你足夠勤快的話,吧資料從一開始推到二十左右你就會發現這個題每十五個數的結果是乙個迴圈,所以只需要將前十五個大表,之後對16取餘加一,直接輸出就好了;

藍橋杯取球博弈

題目 取球博弈 兩個人玩取球的遊戲。一共有n個球,每人輪流取球,每次可取集合中的任何乙個數目。如果無法繼續取球,則遊戲結束。此時,持有奇數個球的一方獲勝。如果兩人都是奇數,則為平局。假設雙方都採用最聰明的取法,第乙個取球的人一定能贏嗎?試程式設計解決這個問題。輸入格式 第一行3個正整數n1 n2 n...

藍橋杯 取球博弈

取球博弈 今盒子裡有n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定 每個人從盒子中取出的球的數目必須是 1,3,7或者8個。輪到某一方取球時不能棄權!a先取球,然後雙方交替取球,直到取完。被迫拿到最後...

藍橋杯 取球遊戲

今盒子裡有n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定 每個人從盒子中取出的球的數目必須是 1,3,7或者8個。輪到某一方取球時不能棄權!a先取球,然後雙方交替取球,直到取完。被迫拿到最後乙個球的一...