Nim 游戏 -(拿石头游戏)

Nim游戏的规则是:spa

1. 有N个石头(确定大于0不然就无法玩了)code

2. 有两个玩家(由于就大家两个好基友)blog

3. 本身先下手(够腹黑的,嘿嘿)游戏

4. 每次必须拿1-3个石头(不能太贪婪)class

5. 最后拿完的算赢(所有都归最后拿完的那我的,若是石头是钻石的话……,这结果会不会致使基友感情破裂?)二进制

 

经过规则发现了一些诀窍:im

1. 若是轮到本身的时候余数为1-3,也就是本身能拿完的时候就赢了;di

2. 若是留给对方的是4个,不管对方怎么拿最终留给本身的老是能一次拿完;相反,你要是获得4个,那你就输了;co

3. 做为腹黑的你确定要千方百计让对方留给你1-3个,或者尽量的留给对方4个;return

4. 只要留给本身的不是4的整数倍,本身就能赢(拿完者赢),由于只要本身不是4的整数倍,本身就能让对方一直变成4的整数倍

 

因此方案就是:

本身要尽量的让对方拿石子以前变成4的整数倍,而本身决不能出现这种状况;

本着双方都是有着爱因斯坦般聪明无比的原则,显然轮到本身时剩余量为4的整数倍本身就输了;

 

代码

1 return ((n % 4) != 0);      // 若是除以4求余结果不是0说明不是4的整数倍
2 return ((n & 0b11)!=0);      // 0b11是二进制3的意思,这里是位与,至关于保留最后两个比特,若是结果不是0说明不是4的整数倍
3 return ((n >> 2 << 2) != n);   // n右移两位再左移两位若是不能和原来的数相同,说明右移丢失的2个比特不是0,这也证实了不是4的整数倍