题目:hdu1536
题意:nim游戏。但是每次拿的数目有限制。
解答:dfs求sg值
注意:dfs的时候vis数组要重新定义!!!!!
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int MAXN = 10010;
const int maxn = 110;
int n,m,k,t;
int a[maxn],sg[MAXN];
int getsg(int v)
{
if(sg[v] != -1)
return sg[v];
int vis[maxn];
memset(vis,0,sizeof(vis));
for(int i = 0;i < k;i++)
{
int temp = v - a[i];
if(temp < 0)
break;
vis[getsg(temp)] = 1;
}
for(int i = 0;;i++)
{
if(!vis[i])
{
sg[v] = i;
return i;
}
}
}
int main()
{
while(~scanf("%d",&k) && k)
{
for(int i = 0;i < k;i++)
scanf("%d",&a[i]);
sort(a,a+k);
scanf("%d",&m);
memset(sg,-1,sizeof(sg));
for(int u = 0;u < m;u++)
{
scanf("%d",&n);
int ans = 0;
for(int i = 0;i < n;i++)
{
scanf("%d",&t);
ans ^= getsg(t);
}
if(ans == 0)
printf("L");
else
printf("W");
}
printf("\n");
}
return 0;
}