我们常常会见到这种博弈的问题,那么现在就是有一道巴什博弈的问题
1.问题描述:
你正在和朋友玩一个游戏:桌子上有一堆石头,每一次你们都会从中拿出1到3个石头。拿走最后一个石头的人赢得游戏。游戏开始时,你是先手。
假设两个人都绝对理性,都会做出最优决策。给定石头的数量,判断你是否会赢得比赛。
举例:有四个石头,那么你永远不会赢得游戏。不管拿几个,最后一个石头一定会被你的朋友拿走。
2.输入样例:
输入:n = 4 输出:False
解析:先手取走1,2或者3,对方都会取走最后一个
输入:n = 5 输出:True
解析:先手拿1个,必胜
3.解题思路:
让我们考虑一些小例子。显而易见的是,如果石头堆中只有一块、两块、或是三块石头,那么在你的回合,你就可以把全部石子拿走,从而在游戏中取胜;如果堆中恰好有四块石头,你就会失败。因为在这种情况下不管你取走多少石头,总会为你的对手留下几块,他可以将剩余的石头全部取完,从而他可以在游戏中打败你。因此,要想获胜,在你的回合中,必须避免石头堆中的石子数为 44 的情况。
我们继续推理,假设当前堆里只剩下五块、六块、或是七块石头,你可以控制自己拿取的石头数,总是恰好给你的对手留下四块石头,使他输掉这场比赛。但是如果石头堆里有八块石头,你就不可避免地会输掉,因为不管你从一堆石头中挑出一块、两块还是三块,你的对手都可以选择三块、两块或一块,以确保在再一次轮到你的时候,你会面对四块石头。显然我们继续推理,可以看到它会以相同的模式不断重复 n = 4, 8, 12, 16, 4,8,12,16,…,基本可以看出如果堆里的石头数目为 44 的倍数时,你一定会输掉游戏。
如果总的石头数目为 44 的倍数时,因为无论你取多少石头,对方总有对应的取法,让剩余的石头的数目继续为 44 的倍数。对于你或者你的对手取石头时,显然最优的选择是当前己方取完石头后,让剩余的石头的数目为 44 的倍数。假设当前的石头数目为 x,如果 xx为 44 的倍数时,则此时你必然会输掉游戏;如果 x 不为 44 的倍数时,则此时你只需要取走 x mod(表示倍数)4 个石头时,则剩余的石头数目必然为 44 的倍数,从而对手会输掉游戏。
4.代码实例
class Solution {
public:
/**
* @param n: an integer
* @return: whether you can win the game given the number of stones in the heap
*/
bool canWinBash(int n) {
return n%4!=0;
}
};