今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个

/*
题目描述
今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。
我们约定:
每个人从盒子中取出的球的数目必须是:1,3,7或者8个。
轮到某一方取球时不能弃权!
A先取球,然后双方交替取球,直到取完。
被迫拿到最后一个球的一方为负方(输方)
请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?
*/

/*可以看出,当某个数要获胜,在其先抽之后剩下的那个数必输即可。
 * 也就是n时,只要n-1,n-3,n-7和n-8只要有一个数字对于乙玩家来说是必输的,
 * 那么甲就是赢家,这就可以利用之前求到的。*/
#include <stdio.h>
void caculate(int n);
int a[10000] = {0, 1, 0, 1, 0, 1, 0, 1, 1};

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        int temp;
        scanf("%d",&temp);
        caculate(temp);
    }
}

void caculate(int n) {
    if (n <= 9) {
        printf("%d
", a[n - 1]);
    } else {
        for (int i = 9; i < n; ++i) {
            a[i] = !(a[i - 1] & a[i - 3] & a[i - 7] & a[i - 8]);
        }
        printf("%d
",a[n-1]);
    }
}
原文地址:https://www.cnblogs.com/ustc-anmin/p/11543618.html