您的位置:首页 > 其它

hihocoder1163 nim博弈

2015-09-07 21:58 253 查看
点击查看题目

[code]#include <cstdio>
#include <iostream>

using namespace std;

int main(){
    int n;
    cin >> n;
    int x = 0;
    for(int i = 0;i < n;i++){
        int a;
        cin >> a;
        x ^= a;
    }
    if(x == 0){
        cout << "Bob" << endl;
    }
    else{
        cout << "Alice"<< endl;
    }
    return 0;
}


定义P为先手必败,N为先手必胜。

若A[1] = 0,那么先手的必输。若A[1] != 0 那么先手必胜。

若假设对于一个局面,当且仅当A[1] xor A[2] xor … xor A
= 0时,该局面为P局面。

那么若A[1] xor A[2] xor … xor A
xor A[n+1] = 0那么A[n+1] == 0,不符合题意。

若A[1] xor A[2] xor … xor A
xor A[n+1] != 0,那么先手如果当前状态是N同样能证明假设。若先手取掉所有的A[n+1] 那么 A[1] xor A[2] xor … xor A
= 0,这时候就有第二个人必输,这时候先手就赢了,也就是说如果当前的所有A异或和等于零那么你怎么取都不能使得下一个人取的时候所有的异或和为0,也就是你下一个人必然是N态,如果先手异或和不是零,那么你总有一种方法使得你取出来其中的一堆中的部分使得其它数异或和变为0,这就是下一个人必输态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: