【发布时间】:2017-05-16 06:58:39
【问题描述】:
游戏是你有N一堆石头,每个玩家轮到他必须从一堆石头中移走至少1块石头,移走最后一块石头的玩家输了。
从基本案例开始,我在十几个案例中写出了获胜者
/*
stones | winner | N | ones
========================================
{1} | Second | 1 | 1
{i}, i>1 | First | 1 | 0
{1,1} | First | 2 | 2
{1,i}, i>1 | First | 2 | 1
{i,j}, i,j>1 | Second | 2 | 0
{1,1,1} | Second | 3 | 3
{1,1,i}, i>1 | First | 3 | 2
{1,i,j}, i,j>1 | First | 3 | 1
{i,j,k}, i,j,k>1 | First | 3 | 0
{1,1,1,1} | First | 4 | 4
{1,1,1,i} | First | 4 | 3
{1,1,i,j}, i,j>1 | Second | 4 | 2
{1,i,j,k}, i,j,k>1 | First | 4 | 1
{i,j,k,m}, ... | Second | 4 | 0
*/
我想我从中推导出了一个公式
static string GetWinner(int[] piles)
{
int n = piles.Length, m = piles.Count(stones => stones == 1);
if(m == n) // one stone per pile
return n % 2 == 0 ? "First" : "Second";
// if here, m < n
return n % 2 == 0 ? (m % 2 == 0 ? "Second" : "First") : "First";
}
但这导致测试用例 {2,1,3} 失败,这应该导致 "Second"。
我尝试使用以下事实。
- 如果是
2,一堆大于2的任何数量的石头都会给出相同的结果。原因是如果它大于2并且玩家没有在那个转牌圈将牌堆缩小到1那么玩家基本上已经让他的对手转牌了。
但是,我可能有些不对劲..
【问题讨论】:
-
我不明白你为什么要测试N,据我所知游戏只与M有关,无论如何你可能想让你的问题更清楚
-
有多少玩家?如果游戏目标是宣布 1 个较松,这意味着应该有超过 1 个赢家。那么,当您需要找到较松的人时,为什么要找到赢家
标签: c# algorithm game-theory