poj1740

本文介绍了一种取石子游戏的策略分析,游戏允许玩家从任意一堆石子中取出一些并重新分配到其他堆中。文章详细解释了如何判断先手玩家是否能够获胜,并提供了编程实现的方法。

【题意】

取石子游戏,有n堆石子(n<=10),每堆有stone[i]颗石子(<=100),A和B玩游戏,每次操作的人可以任选一堆石子拿出来起码一颗,然后可以选择把剩下的石子移到其他的非空石子堆中,给定局面问是否先手必胜

【输入】

多组数据

每组数据第一行一个n表示有多少堆石子

接下来一行n个数字表示每堆石子的数量

【输出】

对于每组数据,输出一个数字,1表示先手胜,0表示后手胜


博弈论

这个可以看出来,要是有两堆一样的那么先手无论如何操作后手只要做对称操作就可以胜利

三堆的时候只要将某一堆拿完使剩下两堆数量相同即可

多堆的时候

若n是奇数,只要将最大的一堆拿走,然后前面的偶数个两个一组将他们补齐即可

若n是偶数,将最大的一堆拿走,将所有的调整为两两相同即可,只有初始局面即是两两相等才无法调整


program poj1740;
var
  count,n,i,j,k:longint;
  have:array [0..101] of longint;
  stone:array [0..11] of longint;

begin
  repeat
    read(n);
    if n=0 then break;
    fillchar(have,sizeof(have),0);
    for i:=1 to n do
      begin
        read(stone[i]);
        inc(have[stone[i]]);
      end;
    if n and 1 = 1 then
      begin
        writeln(1);
        continue;
      end;
    count:=0;
    for i:=1 to n do
      if have[stone[i]] and 1 = 0 then inc(count);
    if count=n then writeln(0)
               else writeln(1);
  until false;
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值