有 n
个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。
请判定 第一个玩家 是输还是赢?
样例
n = 1
, 返回 true
.
n = 2
, 返回 true
.
n = 3
, 返回 false
.
n = 4
, 返回 true
.
n = 5
, 返回 true
.
========================================================================================
先手赢的情景:在先手玩家自己取完的两种情况(取一枚和取两枚)的任意一种下,无论后手取一枚或是两枚都是自己赢的情况。
public boolean firstWillWin(int n) {
if(n==0)return false;
if(n==1)return true;
if(n==2)return true;
if(n==3)return false;
if(n==4)return true;
if(n==5)return true;
boolean[] b = new boolean[n];
b[0] = true;
b[1] = true;
b[2] = false;
b[3] = true;
b[4] = true;
for(int i = 4; i<n ; i++){
//先手取1 后手取1 && 先手取1 后手取2 || 先手取2 后手取2 && 先手取2 后手取1
if( b[i-2]&&b[i-3] || b[i-4]&&b[i-3] )
b[i] = true;
else
b[i] = false;
}
return b[n-1];
}