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

被折叠的 条评论
为什么被折叠?



