hdu1907John(NIM博弈变形)

来源:互联网 发布:linux传送文件命令 编辑:程序博客网 时间:2024/05/21 13:59

正常NIM博弈,取走最后一个石子为赢,后手必胜的条件:a1^a2^...^an==0。不满足这个条件,则先手必胜。

这道题是,取走最后一个算输。

所以当面对石子取完的局面,必胜态。只剩下一个石子时,是必败态。由此开始推。

1.只有一堆大于1的石子时,先手只要取得只剩一个石子就必胜了。

2.当有两堆大于 1的石子时,如果石子数目相等则必败,因为无论你出什么,对手也可以跟着你出,只要最后一步让石子剩下一颗就行了。如果石子数目不同,你只要取一个适当的数,让石子相等,就赢了。

3.可以推出当有N堆大于1的石子时,如果所有石子的结果异或后,不等于0,就是必胜态,你总是可以取到一个适当的数,让下一个局面,必败,即让异或的结果等于0;

4.当有N堆等于1的石子时,如果所以石子异或的结果为0,则为必胜态。或者是偶数个的时候,先手必胜。





代码如下:

#include<iostream>using namespace std;int main(){int T;int n;int a[50];cin >> T;while (T--){cin >> n;int x = 0;int flag = 0;for (int i = 0; i < n; i++){cin >> a[i];if (a[i] > 1)flag++;x ^= a[i];} if(n==1&&flag||flag==0&&x==0||flag!=0&&x)puts("John");   //条件1.3.4else puts("Brother");}return 0;}



原创粉丝点击