经典的博弈题,该题运用的原理叫尼姆博弈,可以运用位运算^来简单求解 。 将本题转换成从m堆牌中任意选择一堆,在里面拿任意个。
如果一旦有人遇到奇异局势,则此人必输,那么用ans^a; 如果最后ans==0那么最开始就是奇异局势,那么第一个人必输
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<set> #include<map> #include<cmath> using namespace std; int m,a; int main(){ while(~scanf("%d",&m)&&m){ int ans = 0; for(int i=0;i<m;i++){ scanf("%d",&a); ans ^= a;//只要最后ans==0 ,就叫奇异局势,谁面对奇异局势都将失败 } if(ans!=0) printf("Rabbit Win!\n"); else printf("Grass Win!\n"); } return 0; }
时间: 2024-10-10 17:02:59