A Chess Game
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1407 Accepted Submission(s): 639
Do you want to challenge me? Just write your program to show your qualification!
4 2 1 2 0 1 3 0 1 0 2 0 2 0 4 1 1 1 2 0 0 2 0 1 2 1 1 3 0 1 3 0
WIN WIN WIN LOSE WIN
==============================
题意:各点之间满足拓扑关系,有向无环图。
第一行 输入点的个数n。接下来n行 每行是第i个点能到达的 点的数量 和 具体的点。
然后是多组询问,还是个数和点,输入0结束。
好像是sg函数的基本定义……
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn=1005;
vector<int>v[maxn];
int n,x,u,q,m;
int sg[maxn];
int dfs(int x){
if(sg[x]!=-1) return sg[x];
if(v[x].size()==0) return sg[x]=0;
bool vis[maxn];
memset(vis,0,sizeof(vis));
for(int i=0;i<v[x].size();i++){
vis[dfs(v[x][i])]=1;
}
for(int i=0;;i++){
if(!vis[i]) return sg[x]=i;
}
}
int main()
{
while(~scanf("%d",&n)){
memset(sg,-1,sizeof(sg));
//sg[0]=0; 注意这里不用这句初始化,因为点之间满足拓扑关系所以没有后继的点sg为0
for(int i=0;i<n;i++){
v[i].clear();
scanf("%d",&x);
while(x--){
scanf("%d",&u);
v[i].push_back(u);
}
}
while(~scanf("%d",&q)){
if(q==0) break;
int ans=0;
while(q--){
scanf("%d",&u);
ans^=dfs(u);
}
if(ans==0) printf("LOSE\n");
else printf("WIN\n");
}
}
return 0;
}
7168



被折叠的 条评论
为什么被折叠?



