题目:
You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first turn to remove the stones.
Both of you are very clever and have optimal strategies for the game. Write a function to determine whether you can win the game given the number of stones in the heap.
For example, if there are 4 stones in the heap, then you will never win the game: no matter 1, 2, or 3 stones you remove, the last stone will always be removed by your friend.
大意:
桌子上有一堆石头,每次只能移走1-3颗,最后移走所有棋的人获胜,A先挪走。A与B永远选择最优策略,那么请问对于给定的石头数目确定A是否能够获胜。
分析:
因为题目要求是双方每次零失误,都选择最优策略,那意味着双方挪走石头水平并没有任何差别,那么对于A来说是失败的数目,对B同样也意味着失败。A是第一个挪走石头的人,在这局游戏中占据优势。(游戏失去公平性)
那么可以列一个表格,
如上,事实上可以看见一定规律。当石子为1-4时,A为赢赢赢输的顺序,当石子数目为5-8时,此时A如果想要让自己赢,就要让B处于面对4石子的局面,那么A最终同样会处于赢赢赢输的顺序。依次,故最后A的胜利与否只与是否为4的倍数有关。
数目 | 对A的是否有利 |
1 | true |
2 | true |
3 | true |
4 | false |
5 | true |
6 | true |
7 | true |
8 | false |
9 | true |
10 | true |
11 | true |
12 | false |
代码:
bool canWinNim(int n) {
if(n%4)return true;
else return false;
}