SG函数 hdu 1536 S-Nim

来源:互联网 发布:npm 淘宝镜像失败 编辑:程序博客网 时间:2024/05/20 04:30
/*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_JUDGEfreopen("in", "r", stdin);#endifwhile( 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");elseprintf("L");}printf("\n");}return 0;}