LightOJ 1253 Misere NIM(反NIM博弈)

Alice and Bob are playing game of Misère Nim. Misère Nim is a game playing on k piles of stones, each pile containing one or more stones. The players alternate turns and in each turn a player can select one of the piles and can remove as many stones from that pile unless the pile is empty. In each turn a player must remove at least one stone from any pile. Alice starts first. The player who removes the last stone loses the game.

Input

Input starts with an integer T (≤ 200), denoting the number of test cases.

Each case starts with a line containing an integer k (1 ≤ k ≤ 100). The next line contains k space separated integers denoting the number of stones in each pile. The number of stones in a pile lies in the range [1, 109].

Output

For each case, print the case number and 'Alice' if Alice wins otherwise print 'Bob'.

Sample Input

3

4

2 3 4 5

5

1 1 2 4 10

1

1

Sample Output

Case 1: Bob

Case 2: Alice

Case 3: Bob

题解:反NIM博弈板题;(anti-NIM博弈见前面博弈总结)知道:先手必胜的状态有两种: 1:全是一个,且ans=0;     

2 : 不全是一个,且ans!=0;(ans为所有的异或和);

其他的情况均为先手必败;

参考代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int T,n,x,ans,cnt;
 4 int main()
 5 {
 6     scanf("%d",&T);
 7     for(int cas=1;cas<=T;cas++)
 8     {
 9         scanf("%d",&n);
10         cnt=ans=0;
11         for(int i=1;i<=n;++i)
12         {
13             scanf("%d",&x);
14             if(x==1) cnt++;
15             ans^=x;    
16         }    
17         if(cnt==n)
18         {
19             if(ans==0) printf("Case %d: Alice\n",cas);
20             else  printf("Case %d: Bob\n",cas);
21         } 
22         else
23         {
24             if(ans) printf("Case %d: Alice\n",cas);
25             else printf("Case %d: Bob\n",cas);
26         }
27     } 
28     
29     
30     return 0;
31 }
View Code

 

posted @ 2019-02-16 18:56  StarHai  阅读(446)  评论(0编辑  收藏  举报