在前面两个题目中,我们讨论了被称为"NIM(拈)“的这种游戏及其变种玩法和必胜策略,下面我们将讨论这类游戏的另一种有趣玩法。假设有两堆石头,有两个玩家会根据如下的规则轮流取石头。每人每次可以从两堆石头中各取数量相等的石头,或者仅从一堆石头中取出任意数量的石头;最后把剩下的石头一次拿光的人获胜。定义一个函数如下: bool nim(n,m) //n,m两堆石头的数量。要求返回一个布尔值,表明首先取石头的玩家是否能赢得这个游戏。
解法一:和朴素的素数筛选法一样,从最小数量的石头堆开始逐个排查,比如(1,2)这个石头堆就是不安全局面,所以这个数字组合就相当于排查出一个质数来,一次以此类推。自底向上的直到排查出所有不安全局面为止。
自己写的代码如下:(时间复杂度为O(n³))
#include <iostream>
using namespace std;
#define M 91//分别输入两堆石头的数量
#define N 56//分别输入两堆石头的数量
const int n=M>N?M:N;
struct Stone
{
int a;
int b;
int flag;
}s[n][n];
//两堆石头的游戏
bool NIM(int ,int )
{
int i,j,t=n,i1=1,j2=2;
while(t--)
{
int FLAG=0;
for