問題描述:
今盒子裡有n個小球,a、b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。
我們約定:
每個人從盒子中取出的球的數目必須是:1,3,7或者8個。
輪到某一方取球時不能棄權!
a先取球,然後雙方交替取球,直到取完。
被迫拿到最後乙個球的一方為負方(輸方)
請程式設計確定出在雙方都不判斷失誤的情況下,對於特定的初始球數,a是否能贏?
程式執行時,從標準輸入獲得資料,其格式如下:
先是乙個整數n(n<100),表示接下來有n個整數。然後是n個整數,每個佔一行(整數<10000),表示初始球數。
程式則輸出n行,表示a的輸贏情況(輸為0,贏為1)。
例如,使用者輸入:41
21018則程式應該輸出:01
10分析:當n=1的時候,a一定會輸;
當n=1+[1,3,7,8]的時候,a一定會贏,因為a可以取1,3,7,8對應的那個數,然後把1留給b;
也就是說,當n的值是乙個必輸的情況加1,3,7,8的時候,則a可以取到對應的值,而把必輸情況交給b。
我們根據這條規律,把n的所有取值1~10000都進行標記為1(必勝)或者0(必輸),然後對輸出對應的標記即可。
#includeusing namespace std;
void fun(int *a)
; for(int i=1;i+8<10000;i++)
} }int main()
; fun(a);
int n,m;
cin>>n;
for(int i=0;i>m;
cout<
void fun(int *a)
; for(int i=1;i+8<10000;i++)
{ if(a[i]==0) //必敗局勢
{ cout<
我們可以發現,所有的必敗局勢都是在1,3,5,7的基礎上加15的倍數得到的,至於為什麼是15,我一直也沒想明白。
在這個結論的基礎上,可以對**進行簡化:
#includeusing namespace std;
int main()
{ int n,m,t;
cin>>n;
while(n--)
{ cin>>m;
t = m%15;
if(t==1||t==3||t==5||t==7)cout<<0<
藍橋杯2012河南初賽 取球博弈
今盒子裡有n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定 每個人從盒子中取出的球的數目必須是 1,3,7或者8個。輪到某一方取球時不能棄權!a先取球,然後雙方交替取球,直到取完。被迫拿到最後乙個球的一...
藍橋杯試題 取球遊戲
今盒子裡有 n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定 每個人從盒子中取出的球的數目必須是 1,3,7或者 8個。輪到某一方取球時不能棄權!a 先取球,然後雙方交替取球,直到取完。被迫拿到最後乙個...
藍橋杯歷屆試題 取球遊戲
今盒子裡有n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定 每個人從盒子中取出的球的數目必須是 1,3,7或者8個。輪到某一方取球時不能棄權!a先取球,然後雙方交替取球,直到取完。被迫拿到最後乙個球的一...