hdu 1524 A Chess Game 博弈】的更多相关文章

题目链接 给出一个有向无环图, 上面放有一些棋子, 两个人轮流移动棋子, 当一个人无法移动时, 算输. 求出每一个点的sg值, 异或就可以.出度为0的点sg值为0. #include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define m…
一个拓扑结构的图,给定n个棋的位置,每次可以沿边走,不能操作者输. 已经给出了拓扑图了,对于每个棋子找一遍SG最后SG和就行了. /** @Date : 2017-10-13 20:08:45 * @FileName: HDU 1524 树上无环博弈 暴力SG.cpp * @Platform: Windows * @Author : Lweleth (SoungEarlf@gmail.com) * @Link : https://github.com/ * @Version : $Id$ */…
http://acm.hdu.edu.cn/showproblem.php?pid=5724 Chess Problem Description   Alice and Bob are playing a special chess game on an n × 20 chessboard. There are several chesses on the chessboard. They can move one chess in one turn. If there are no other…
题意:一个N个点的拓扑图,有M个棋子,两个人轮流操作,每次操作可以把一个点的棋子移动到它的一个后继点上(每个点可以放多个棋子),直到不能操作,问先手是否赢. 思路:DFS求每个点的SG值,没有后继的点为必败点. 注意搜索中初始化的问题. #include<stdio.h> #include<string.h> ,M=N*N; struct node{ int v,next; }e[M]; int head[N],cnt,in[N],out[N],n,sg[N],p[N]; void…
SG函数!! 代码如下: #include<stdio.h> #include<cstring> #define I(x) scanf("%d",&x) ][],sg[]; int getsg(int n) { ) return sg[n]; ]) ; ]; memset(vis,,sizeof(vis)); ;i<=map[n][];i++) vis[getsg(map[n][i])]=; ; while(vis[i]) i++; return…
题目大意 : 在一个 有向无环图顶点上面有几个棋子, 2个人轮流操作, 每次操作就是找一个棋子往它能够移 动的地方移动一格, 不能操作的人输. 输入第一行 为一个 N , 表示有 N 个顶点 0 -> N-1 标记, 然后 接下来的N 行 代表 与第 i 行 相连的有哪几个顶点 , 每一行开头一个 M 表示 有M 哥点与 点 i 相连. 然后接下来是 任意个询问, 一开始 是一个 M, 表示棋盘初始有 M 个棋子, 接下来的 M 个数 表示顶点i 上 有棋子, M == 0 代表询问结束 解题思…
取石子游戏 HDU 1527 博弈论 威佐夫博弈 题意 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者. 输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000. 输出对…
题意:在一个有向无环图上有n个顶点,每一个顶点都只有一个棋子,有两个人,每次根据这个图只能将任意一颗棋子移动一步 ,如果到某一步玩家不能移动时,那么这个人就输. 分析:本题是最典型的有向无环图的博弈,利用dfs把所有顶点的SG值都计算出来,然后对每个棋子的SG值进行异或运算,如果 为0就是先手必败,否则就是先手必胜. 如果某个人移动到出度为0的顶点,那么他必败,在这里首先介绍一下什么是SG函数. 对于给定的有向无环图,定义图中每个顶点的Sprague-Grundy函数g如下:g(x) = mex…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1524 #include<stdio.h> #include<cstring> using namespace std; ;// ; int sg[N], head[N]; int cnt; struct node{ int from; int to; int next; }edge[M]; void addedge( int from, int to){ edge[cnt].from…
http://acm.hdu.edu.cn/showproblem.php? pid=1849 简单的尼姆博弈: 代码例如以下: #include <iostream> #include <cstdio> using namespace std; int main() { int m,n,t; while(cin>>m,m) { int ans=0; for(int i=0; i<m; i++) { cin>>n; ans^=n; } if(ans==…