题意:给出一个有向无环图,再给出如干个出站位置;最后每一行给出如干个棋子的初始位置,两个人轮流移动棋子,最后不能移动的人输。
以下用dfs实现的,超时:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=1005;
int vis[maxx][maxx];
int sg[maxx];
int n,m;
void dfs_sg(int x){
int visited[maxx];
memset(visited,0,sizeof(visited));
for(int i=0;i<n;i++){
if(vis[x][i]==1){
if(sg[i]==0){
dfs_sg(i);
}
visited[sg[i]]=1;
}
}
for(int i=0;;i++){
if(visited[i]==0){
sg[x]=i;
break;
}
}
}
int main(){
while(scanf("%d",&n)){
if(n==0)break;
memset(sg,0,sizeof(sg));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
scanf("%d",&m);
int x;
if(m==0){
sg[i]=0;
}
for(int j=0;j<m;j++){
scanf("%d",&x);
vis[i][x]=1;
}
}
for(int i=0;i<n;i++){
if(sg[i]==0){
dfs_sg(i);
}
}
while(cin>>m){
if(m==0)break;
int ans=0;
for(int i=0;i<m;i++){
int x;
scanf("%d",&x);
ans^=sg[x];
}
if(ans){
cout<<"WIN"<<endl;
}else{
cout<<"LOST"<<endl;
}
}
}
return 0;
}