A New Stone Game(博弈)

Description

Alice and Bob decide to play a new stone game.At the beginning of the game they pick n(1<=n<=10) piles of stones in a line. Alice and Bob move the stones in turn. 
At each step of the game,the player choose a pile,remove at least one stones,then freely move stones from this pile to any other pile that still has stones. 
For example:n=4 and the piles have (3,1,4,2) stones.If the player chose the first pile and remove one.Then it can reach the follow states. 
2 1 4 2 
1 2 4 2(move one stone to Pile 2) 
1 1 5 2(move one stone to Pile 3) 
1 1 4 3(move one stone to Pile 4) 
0 2 5 2(move one stone to Pile 2 and another one to Pile 3) 
0 2 4 3(move one stone to Pile 2 and another one to Pile 4) 
0 1 5 3(move one stone to Pile 3 and another one to Pile 4) 
0 3 4 2(move two stones to Pile 2) 
0 1 6 2(move two stones to Pile 3) 
0 1 4 4(move two stones to Pile 4) 
Alice always moves first. Suppose that both Alice and Bob do their best in the game. 
You are to write a program to determine who will finally win the game. 

Input

The input contains several test cases. The first line of each test case contains an integer number n, denoting the number of piles. The following n integers describe the number of stones in each pile at the beginning of the game, you may assume the number of stones in each pile will not exceed 100. 
The last test case is followed by one zero. 

Output

For each test case, if Alice win the game,output 1,otherwise output 0. 

Sample Input

3
2 1 3
2
1 1
0

Sample Output

1
0

解题思路

必胜态能转化为必败态交给对方,始终维持自己必胜态;必败态一次操作只会是必胜态交给对方。

题意:n堆石子,两个人轮流取,每次选一堆至少丢弃1枚石子,然后可以将剩下的任意枚随意放入其他堆中。取完最后的棋子的为胜者,无法进行操作 的为败者。

这题主要是寻找必败态。

如果只有一堆石子,先手必胜态。

如果有两堆石子,并且两堆石子的数量相等,那么先手采取什么样的策略,后手采取一样的策略,先手必败态。

这里解释一下:先手采取什么样的策略,后手采取一样的策略,就能保持两堆石子每轮操作后,个数相等,左后先手面临1,1的必败态。

如果有三堆石子,那么先手可以在第一步取到只剩两堆相同数量的石子,先手必胜。

ps:两堆较少堆的差是不会超过最大堆的。

如果有四堆石子,由于三堆石子是必胜态,所以只要逼对方取完某一堆石子,而只有在四堆石子都为1时,才能迫使某一方取完一堆石子,

只有当四堆石子可以分成两两相等的两队时,先手必败。

总结:

当n为偶,且可以分成n/2对两两相等的石子时,先手必败,否则先手必胜。

当n为偶数,且不能分成两两相等时,先手必胜态。

当n为奇数,总可以选择最大堆,调整成偶数堆两两相等状态,即必败态给对手。


AC代码

#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
    int n, i, a[21];
    while(scanf("%d", &n)!=EOF, n)
    {
        for(i=0; i<n; i++)
            scanf("%d", &a[i]);
        if( n%2==1 )
            printf("1\n");
        else
        {
            sort(a, a+n);
            for(i=0; i<n-1; i+=2)
                if( a[i]!=a[i + 1] )
                {
                    printf("1\n");
                    break;
                }
            if( i==n )
                printf("0\n");
        }
    }
    return 0;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值