S-NIM:在NIM游戏的基础上加入了S值,限制REMOVE BEADS的数量。 其实只要用SG函数就可以解出来了。 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int k; //enable的个数 int enable[100]; //规定可以取走的数 int SG[10001]; //存放SG值 int SG_value(int n) //求SG值 { int i,temp; int judge[100]={0}; //用于寻找最小的SG值做标记 for(i=0;i<k;i++) { temp = n - enable[i]; if(temp<0) break; if(SG[temp]==-1) //寻找最小的SG数 SG[temp]=SG_value(temp); judge[SG[temp]]=1; //为后继点加上标记 } for(i=0;;i++) //找到每一个SG[i]的最小SG值 { if(judge[i]==0) return i; } } int main() { int n,i,m,t,s; while(scanf("%d",&k),k) { for(i=0;i<k;i++) scanf("%d",&enable[i]); sort(enable,enable+k); memset(SG,-1,sizeof(SG)); SG[0]=0; scanf("%d",&n); while(n--) { scanf("%d",&m); s=0; while(m--) { scanf("%d",&t); if(SG[t]==-1) SG[t] = SG_value(t); s=s^SG[t]; } if(s==0) printf("L"); else printf("W"); } printf("/n"); } }