poj2425--A Chess Game

题意:给定一棵有向图的树,有些节点上有石子,每次可以取一个石子向一个有向边移动,不能移动者负。

Ans:树上nim,叶子节点nim为0,父亲节点递归儿子得到sg值,答案就是每个石子所在点的sg值异或和。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<string>
 6 #include<algorithm>
 7 int sg[1005],s[1005],n,x,ans,m;
 8 int tot,go[1005*2005],first[1005],next[1005*2005],ru[1005],num;
 9 void insert(int x,int y){
10     tot++;
11     go[tot]=y;
12     next[tot]=first[x];
13     first[x]=tot;
14 }
15 int dfs(int x){
16     if (s[x]!=-1) return s[x];
17     //if (first[x]==0) return s[x]=0;
18     int ss[1024];
19     memset(ss,0,sizeof ss);
20     for (int i=first[x];i;i=next[i]){
21         int pur=go[i];
22         ss[dfs(pur)]=1;
23     }
24     for (int i=0;i<=n+1;i++)
25      if (ss[i]==0) return s[x]=i;
26 }
27 int main(){
28     freopen("tx.in","r",stdin);
29     while (~scanf("%d",&n)){
30     memset(s,-1,sizeof s);
31     memset(first,0,sizeof first);
32     memset(ru,0,sizeof ru);
33     tot=0;
34     for (int i=0;i<n;i++){
35         scanf("%d",&num);
36         for (int j=1;j<=num;j++){
37          scanf("%d",&x);
38          insert(i,x);
39          ru[x]++;
40         }
41     }
42     for (int i=0;i<n;i++)
43      if (ru[i]==0){
44          s[i]=dfs(i);
45      }
46     while (scanf("%d",&m)&&m){
47     ans=0;
48     for (int i=1;i<=m;i++){
49         scanf("%d",&x);
50         ans^=s[x];
51     }
52     if (ans) printf("WIN\n");
53     else printf("LOSE\n");
54     }
55     }
56 }
时间: 2024-10-14 00:34:43

poj2425--A Chess Game的相关文章

[poj2425]A Chess Game_博弈论

A Chess Game poj-2425 题目大意:题目链接 注释:略. 想法:这个题就是为什么必须要用记忆化搜索.因为压根就不知道后继是谁. 我们通过SG定理可知:当前游戏的SG值等于所有子游戏的SG的异或和. 我们就可以dp了. 最后,附上丑陋的代码... ... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define N 1010 in

博弈论类题目小结——转载

出处http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 首先当然要献上一些非常好的学习资料: 基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530 经典翻硬币游戏小结:http://blog.csdn.net/acm_cxlove/article/details/7854534 经典的删边游戏小结:http://blog.csdn.net/acm

【POJ2425】A Chess Game 博弈,SG函数,裸题,模板题

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42653921 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意:给一个有向无环图(拓扑图),有若干个棋子,两人轮流操作,每次可以把其中某棋子沿图走一步,无法操作者输. 题解:SG函数裸题,模板题 代码: #include <cstdio> #include <cstring> #include <iostream> #include <a

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )

dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const in

hdu 3004 The Chess【广独优先搜索】

The Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 466    Accepted Submission(s): 130 Problem Description Mr Li likes playing chess very much. One day he made a simplified version of the

HDU 4405 Aeroplane chess (概率DP求期望)

题意:有一个n个点的飞行棋,问从0点掷骰子(1~6)走到n点需要步数的期望 其中有m个跳跃a,b表示走到a点可以直接跳到b点. dp[ i ]表示从i点走到n点的期望,在正常情况下i点可以到走到i+1,i+2,i+3,i+4,i+5,i+6 点且每个点的概率都为1/6 所以dp[i]=(dp[i+1]+dp[i+2]+dp[i+3]+dp[i+4]+dp[i+5]+dp[i+6])/6  + 1(步数加一). 而对于有跳跃的点直接为dp[a]=dp[b]; #include<stdio.h>

XTU1176:I Love Military Chess

述 陆军棋,又称陆战棋,简称军棋,是中国近代的一种两人棋类,设计根据军队中的军阶.每一方有25枚棋子,先夺得对方军旗者为胜. 棋子 每一方的棋子为25枚,包括: 军阶高低 棋子名称 各方枚数 特殊能力 1 司令 1 无 2 军长 1 无 3 师长 2 无 4 旅长 2 无 5 团长 2 无 6 营长 2 无 7 连长 3 无 8 排长 3 无 9 工兵 3 铁路上格数不限并可转弯,攻击胜过地雷 M 地雷 3 不能移动,胜过其他一切攻击棋子,工兵/炸弹除外 B 炸弹 2 遇到敌方棋子皆同归于尽,军

百度之星2017 HDU 6114 Chess 组合数学

Chess 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6114 Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子.一天,小度在棋盘上摆起了许多車--他想知道,在一共N×M个点的矩形棋盘中摆最多个数的車使其互不攻击的方案数.他经过思考,得出了答案.但他仍不满足,想增加一个条件:对于任何一个車A,如果有其他一个車B在它的上方(車B行号小于車A),那么車A必须在車B的右边(車A列号大于車B).现在要问问

hdu-5794 A Simple Chess(容斥+lucas+dp)

题目链接: A Simple Chess Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description There is a n×m board, a chess want to go to the position (n,m) from the position (1,1).The chess is able to go to position (