题目链接:点击这里
考察 时:
- 你取走 ,对手取走 ,对手赢
- 你取走 ,对手取走 ,对手赢
- 你取走 ,对手取走 ,对手赢
- 所以 是一种必输策略
初始状态:
- 必输, 必胜
- 必输, 必胜
所以,若存在一种 ,使得 必输,那么 则是必胜。不存在这种 就是必输状态,就是怎么走别人都必胜。
到这里就可以循环打表了。
class Solution {
public:
bool canWinNim(int n) {
vector<bool> f(n+1, false);
for(int i = 0; i < n ; i++) {
if(!f[i]) {
for(int j = 1; j <= 3; j++) {
f[i+j] = true;
}
}
}
return f[n];
}
};
超时。我们再接着推。
由于每次取走的 ,记
- 必输, 必胜
- 必输, 必胜
- 必输, 必胜
所以,
- 必输
- 必胜,此时我们每次都取走余数,对方就变成了必输状态。
AC代码如下:
class Solution {
public:
bool canWinNim(int n) {
if(n%4==0) return false;
else return true;
}
};