LintCode 394: First Will Win

LintCode 394: First Will Win

题目描述

n个硬币排成一条线。两个参赛者轮流从右边依次拿走12个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。

请判定 第一个玩家 是输还是赢?

样例

n = 1, 返回 true.

n = 2, 返回 true.

n = 3, 返回 false.

n = 4, 返回 true.

n = 5, 返回 true.

Sat Feb 26 2017

思路

一般这种博弈的题目都是假设双方足够聪明,能够用最优的策略取得胜利的,看似很麻烦,实际上却简化了问题,因为这样的话每一个状态都确定了。

假设硬币数n是三的倍数,那么不管第一个人拿第一次拿了一个硬币还是两个硬币,第二个人都会跟第一个人拿的数量凑够三个,如此循环,最终肯定是第二个人获胜。

假设硬币数n不是3的倍数,则不管3n是余1还是余2,第一个人第一次只需要拿走余数个硬币,剩下的硬币数就是3的倍数了,情况就变成了上一种情况,只不过胜负易位了。

代码

// 硬币排成线
bool firstWillWin(int n)
{
    return n % 3 != 0;
}
posted @ 2017-02-26 14:28  GenkunAbe  阅读(176)  评论(0编辑  收藏  举报