我看到这道题,每一对方走的都是最优解,就让我想到了极大极小算法,这个可以应用在智能五子棋的算法;
但是这一题当我看了答案后,发现思路真的很简单,可是我没想到。。。。
示例:
输入: 4
输出: false
解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;
因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走
所以只要你手中是4的倍数,则一定输,如果是5,6,7,则一定会赢,因为你总可以有办法使得对方手中的棋子是4个;
bool canWinNim(int n) {
if(n%4==0) return false;
else return true;
}
可是,我刚开始没有按照这个思路去向,导致我就被局限住了,一定得注意;
我想的是,当你此时手中的棋子使得下一层(敌方)有一个返回true(表示你赢);则说明你是可以赢得,即自底向上得,就是递归,很明显,这样当n超大的时候,你的代码就是垃圾;
bool min_max(int n,int check)
{
if(n<=3 &&check==1) return true;
else if(n<=3 &&check==0) return false;
bool c1=0;
bool c2=0;
bool c3=0;
c1=min_max(n-1,(check+1)%2);
c2=min_max(n-2,(check+1)%2);
c3=min_max(n-3,(check+1)%2);
if(c1 ||c2 ||c3 &&check) return true;
else return false;
}
bool canWinNim(int n) {
return min_max(n,1);
}