标签:ima ret 初始化 分享 元素 棋盘 方向 状态 初始
一种用于确定一个博弈是否有必胜方法的函数
注:若一个点存在一个操作(道路)可以达到比必败点,则这个点是必胜点,否则是必败点。
举个栗子:。
一个N*M棋盘,一个棋子放在右上角,只能往←、↙,↓三个方向走。两人轮流移动棋子,首先移到左下角的获胜。 请问:当N、M满足什么条件时先手必胜?
如图,由必胜点和必败点的关系可无限拓展。
举例:
有n个石子,一次只能取出1、3、4个,两人轮流取,首先取完石子的获胜
如图,同上,若一个点存在一个操作(道路)可以达到比必败点,则这个点是必胜点,否则是必败点。直观的,若SG大于0,则为必胜点。
int cmd[n]; //每个元素代表一个操作
int SG[a];
int mex[b]; //用于标记mex函数中已经出现的整数
int *sg()
{
menset(SG,0,sizeof(SG));
int i,j;
for(i=1;i<a;i++) //从1开始因为SG[0]=0
{
menset(mex,0,sizeof(mex)); //每次都要初始化标记
for(j=0;j<n&&cmd[j]<=i;j++)
{
mex[SG[ i-cmd[j] ]=1; //标记
}
for(i=0;i<b;i++)
{
if(!mex[i]) //找到第一个不被标记(未出现)的的整数i
SG[i]=i;
}
}
return SG;
}
标签:ima ret 初始化 分享 元素 棋盘 方向 状态 初始
原文地址:https://www.cnblogs.com/Bz1092467670/p/10047931.html