/*
http://acm.hdu.edu.cn/showproblem.php?pid=1536
题意:取石子问题,但是每次所取的石子的个数必须是s[]里面的数,求每个位置是必败点还是胜点
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 105;
const int M = 10005;
int s[N], ans[N], SG[M], snum;
void DFS(int x){
bool flag[M] = {false};
for(int i=0; i<snum; i++){
int temp = x - s[i];
if(temp >= 0){
if(SG[temp] == -1)
DFS(temp);
flag[ SG[temp] ] = true;
}
}
for(int i=0; i<M; i++)
if(flag[i] == false){
SG[x] = i;
return ;
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in", "r", stdin);
#endif
while( scanf("%d", &snum), snum){
for(int i=0; i<snum; i++)
scanf("%d", &s[i]);
SG[0] = 0;
for(int i=0; i<M; i++)
SG[i] = -1;
int heaps;
scanf("%d", &heaps);
while(heaps--){
int hnum, res = 0;
scanf("%d", &hnum);
while(hnum--){
int tmp;
scanf("%d", &tmp);
if(SG[tmp] == -1)
DFS(tmp); //获得tmp的SG值:是没在tmp的后继的SG值中出现的最小自然数
res ^= SG[tmp];
}
if(res)
printf("W");
else
printf("L");
}
printf("\n");
}
return 0;
}
SG函数 hdu 1536 S-Nim
最新推荐文章于 2018-08-28 14:01:38 发布