1300 · 巴什博弈
算法
简单
通过率
55%
描述
你正在和朋友玩一个游戏:桌子上有一堆石头,每一次你们都会从中拿出1到3个石头。拿走最后一个石头的人赢得游戏。游戏开始时,你是先手。
假设两个人都绝对理性,都会做出最优决策。给定石头的数量,判断你是否会赢得比赛。
举例:有四个石头,那么你永远不会赢得游戏。不管拿几个,最后一个石头一定会被你的朋友拿走。
样例
样例 1:
输入:n = 4
输出:False
解析:先手取走1,2或者3,对方都会取走最后一个
样例 2:
输入:n = 5
输出:True
解析:先手拿1个,必胜
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) {
// Write your code here
/**
剩余石子数正好是4的倍数的时候,谁先拿必败,
因此算除以四的余数,如果有余数,
那么第一个人就可以先拿这些余数,
那么对手就会成为第一个开始在4倍数石头里面拿石头的人,
也就是他会输
4=>4%4==0,我先拿只能拿1/2/3个,然后他拿最后的3/2/1 俺必输
5=>5%4==1,我可以先拿余数1,然后他从剩余的4个拿1/2/3,最后剩下的都是俺的
10=>10%4==2,我可以先拿余数2,他去1/2/3,还剩7/6/5,我再取7%4==3/6%4==2/5%4=1,
还剩4个,这时无论他取1/2/3,俺都是最后一个[把他最后赶到从4个里选]
**/
if(n%4==0){
return false;
}else{
return true;
}
}
};
/*
1+3=4;只要最后对方拿时,剩余石头数是4,则我方必赢,因为无论对方拿几,我方都能一次拿完
题目变为:n能不能变为4,由此发现只要我们首次取n%4个石头,
对方就会从4的倍数开始取(因为我们取走了余数,剩余一定被4整除),那么接下来,
无论对方取几(1,2,3都不大于4),我们总能让对方一直处于4的倍数状态,直到获胜,
因此题目最终变为:n能否被4整除;如不能则我方获胜,如果能则我方失败;
解题思路
//如果n小于4,则一定是先手拿走最后一个石头
//如果n等于4,或者说是n是4的倍数,则无论先手一开始取走几个a,
后手则会取4-a,从而可使后手拿走最后一个石头。
//如果n大于4,且不是4的倍数,则可以先手拿走n取4的余数,则同上一步,先手可拿走最后一个石头。
*/