lc292.Nim 游戏
            
               约 284 字 
                 预计阅读 1 分钟 
         
博弈论
- 博弈论问题一般是两方进行对抗的问题
 
- 首先如果有3枚以下的石头,那么我方一定获胜。如果有4枚石头,我方一定能获胜。
 
- 考虑5颗石头的情况,由于每次只能拿$1-3$颗石头,所以我们应该考虑$f[i],i \in {4,3,2}$,一旦其中有必败的情况,表示我方一定获胜。
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
  | 
class Solution {
public:
    bool canWinNim(int n) {
        vector<int> f(n + 1, true);
        if(n >= 4)  f[4] = false;
        for(int i = 5; i <= n; i++){
            f[i] = false;
            for(int j = i - 1; i - j <= 3; j--){
                if(f[j] == false){
                    f[i] = true;
                }
            }
        }
        return f[n];
    }
};
  | 
 
找规律
- 我们可以发现当石头的数量是4的倍数时,我们一定失败,否则一定会获胜。
 
1
2
3
4
5
6
7
8
9
  | 
class Solution {
public:
    bool canWinNim(int n) {
        vector<int> f(4, true);
        f[0] = false;
        
        return f[n % 4];
    }
};
  | 
 
类似题目进阶