poj 2425
给出一个无环有向图,在节点上放几个棋子,两个人往有向路径移动,最后没的移动的输。
搜索求SG值。具体看代码
AC代码:
#include<stdio.h> #include<string.h> #define N 1010 struct pro { int v,next; } edge[1000*N]; int head[N],sg[N]; int e; void init() { memset(head,-1,sizeof(head)); memset(sg,-1,sizeof(sg)); e=0; } void addedge(int u,int v) { edge[e].v=v;edge[e].next=head[u]; head[u]=e++; } int getsg(int u) { int i,v; if (sg[u]!=-1) return sg[u]; int flag[N]; memset(flag,0,sizeof(flag)); for (i=head[u];i!=-1;i=edge[i].next)//所有后继节点sg flag[getsg(edge[i].v)]=1; for (i=0;flag[i];++i);//求sg[u]=met(); sg[u]=i; return i; } int main () { int n,m,x,ans; int i,j,k; while (scanf("%d",&n)!=EOF) { init();//初始化 for (i=0;i<n;++i)//构造有向图 { scanf("%d",&m); for (j=0;j<m;++j) { scanf("%d",&x); addedge(i,x); } if (!m) sg[i]=0;//终止条件 } while (scanf("%d",&m)&&m)//询问,m颗棋子 { ans=0; for (i=0;i<m;++i) { scanf("%d",&x); ans^=getsg(x);//求各个棋子的sg值异或 } if (ans) printf("WIN\n"); else printf("LOSE\n"); } } return 0; }