1.从一堆中拿出一部分
2.将一堆分为俩堆,多堆时仅加for循环即可。
void get_sg()
{
//nim博弈 , 选择的是任意连续的数字 , 因此在这里sg[x]=x
memset(sg , 0 , sizeof(sg));
sg[0] = 0 ;
sg[1] = 1 ;
for(int i = 1 ; i < maxn ; i++)//每堆中有多少个石子,求出每个数量的sg值
{
memset(Hash , 0 , sizeof(Hash));
for(int j = 1 ; j <= i ; j++)
{
Hash[sg[i-j]] = 1;//取任意数量
}
for(int j = 1 ; j < i ; j++)
{
Hash[sg[j] ^ sg[i-j]] = 1;//将石子分成两堆
}
for(int j = 0 ; j <= maxn ; j++)
{
if(Hash[j] == 0)
{
sg[i]= j;
break;
}
}
cout <<i <<":" <<sg[i] << endl;
}
}