题意就是给出一个数组s。为每次可以取石子的数目。
然后给你n堆石子每堆si。求解先手能不能赢!标准的sg函数用法题目。
#include <iostream> #include <algorithm> #include <string> using namespace std; int s[101];//存放每次可以取得石子,即可以进行的步骤 int sg[10001]; //每个石子堆的sg函数值 int k; //每次可以取石子的个数总和 int getsg(int m) { int hash[101]={0}; int i; for(i=0;i<k;i++){ if(m-s[i]<0) { break; } if(sg[m-s[i]]==-1) { sg[m-s[i]]=getsg(m-s[i]); } hash[sg[m-s[i]]]=1; } for(i=0;;i++) { if(hash[i]==0) { return i; } } } int main(){ while (cin>>k && k) { for (int i = 0; i < k;i++) { cin>>s[i]; } sort(s,s+k); memset(sg,-1,sizeof(sg)); sg[0] = 0; int t; cin>>t; while (t--) { int n,m; cin>>n; int ans = 0; while (n--) { cin>>m; if (sg[m]==-1) { sg[m]=getsg(m); } ans ^= sg[m]; } if (ans == 0) { cout<<"L"; } else cout<<"W"; } cout<<endl; } return 0; }