题目大意:反Nim游戏,即取走最后一个的人输
首先状态1:如果所有的堆都是1,那么堆数为偶先手必胜,否则先手必败
然后状态2:如果有两个堆数量相同且不为1,那么后手拥有控场能力,即:
若先手拿走一堆,那么后手可以选择将另一堆留下1个或者全拿走,使这两堆最终只剩1个或0个;
若先手将一堆拿剩一个,那么后手可以选择将另一堆留下一个让先手拿或全拿走,使这两堆最终只剩1个或0个;
若先手将一堆拿走一部分,那么后手可以将另一堆同样拿走一部分,然后同上
状态3:若Xor!=0 那么先手可以先拿走一部分让Xor=0 然后同状态2先手必胜 否则先手必败
※鉴于本人过于沙茶,以上内容仅存在参考价值,无法证明正确性,欢迎指正
于是若所有堆全是1 Xor==0先手必胜 否则后手必胜
若有堆不是1 Xor==0后手必胜 否则先手必胜
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n; bool Calculate() { int i,x,xor_sum=0; bool flag=1; cin>>n; for(i=1;i<=n;i++) { scanf("%d",&x); if(x^1) flag=0; xor_sum^=x; } if(flag) return !xor_sum; else return xor_sum; } int main() { int T,i; for(cin>>T;T;T--) { if( Calculate() ) puts("John"); else puts("Brother"); } }
BZOJ 1022 SHOI2008 小约翰的游戏John 博弈论
原文地址:http://blog.csdn.net/popoqqq/article/details/40543799