1. 程式人生 > >藍橋杯 取球遊戲 博弈

藍橋杯 取球遊戲 博弈

Problem Description

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

我們約定:

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

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

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

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


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

Input

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

Output

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

Sample Input

4
1
2
10
18

Sample Output

0
1
1
0
題意:n個球,A先取,B再取,A,B交替取,A,B可以取{1,3,7,8}中的任一球數,取最後一個球的人輸。 #include<stdio.h>
#include<string.h>


#define N 10050


int a[N];




int main()
{
int t,i,j;
int n;
int b[4] = {1,3,7,8};

memset(a,0,sizeof(a));
for( i = 1; i <= 10000; i ++)
{
if(a[i] == 0)//只要球數為必敗時 
{
for( j = 0; j < 4; j ++)
a[i+b[j]] = 1;//從前往後遞推 
}
}
scanf("%d",&t);
while( t --)
{
scanf("%d",&n);
printf("%d\n",a[n]);
}
return 0;
}
我的思路是:當總球數為:A必敗的球數加上{1,3,7,8}中任一球數時,則A必勝。因為A可以取{1,3,7,8}中的任一球數,把A必敗的球數留給B。 例如:A必敗球數為1,當總球數為2,4,8,9,A可以先取1,3,7,8,B最後只能取1,則A必贏。 從總球數為1開始,把下標為2,4,8,9的陣列元素標記為1(必勝),從前往後遞推。