题意:
两个人在一个有向五环图上面走棋子,每次只能走一步,最后谁
* 没有棋子可走就败,然后棋子可以重叠,并且有n个棋子。要求判断* 先手的胜负。
纠结了好长时间一直在想为什么sg函数要呢么定义然后看了各种博客但是只是讲了,定义的内容却很少有讲为什么的。。。。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int Map[1005][1005];
int sg[1005],n;
int dfs(int a)
{
if(sg[a]!=-1)
return sg[a];
bool vis[2000]={0};
for(int i=0;i<n;i++)
{
if(Map[a][i]==1)
{
vis[dfs(i)]=1;
}
}
for(int i=0;i<n;i++)
if(vis[i]==0)
return sg[a]=i;
}
int main()
{
while(~scanf("%d",&n))
{
memset(sg,-1,sizeof(sg));
memset(Map,0,sizeof(Map));
for(int i=0; i<n; i++)
{
int a;
scanf("%d",&a);
if(a==0) //注意这个地方,这个地方是当没有后继的时候他的sg函数为0
{
sg[i]=0;
continue;
}
while(a--)
{
int b;
scanf("%d",&b);
Map[i][b]=1;
}
}
int m;
while(~scanf("%d",&m)&&m)
{
int ans=0;
for(int i=0;i<m;i++)
{
int a;
scanf("%d",&a);
if(sg[a]!=-1)
ans^=sg[a];
else
ans^=dfs(a);
}
if(ans==0)
printf("LOSE\n");
else
printf("WIN\n");
}
}
return 0;
}