http://acm.hdu.edu.cn/showproblem.php?pid=4678

自己太蠢...没学SG...还是浩神指点我SG精髓以后才A的这题...(第一题SG

这里子游戏之间没有影响所以只要找规律得出所有子游戏的SG值 然后求XOR就行了

这里题面太复杂 但看懂以后其实可以转换成取石子游戏:

给你N堆石子 , 每次只能取一个或者整堆取走 谁先取完谁胜

每堆石子的数量就是空白部分附近所有连接数字的数量+1(空白本身算一个石子)

孤立的单个数字也组成一堆

那么根据找规律可得:

奇数堆SG = 1 偶数堆SG = 2

/********************* Template ************************/
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std; #define EPS 1e-8
#define MAXN 1005
#define MOD (int)1e9+7
#define PI acos(-1.0)
#define DINF (1e10)
#define LINF ((1LL)<<50)
#define INF ((int)1e10)
#define max(a,b) ((a) > (b) ? (a) : (b))
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max3(a,b,c) (max(max(a,b),c))
#define min3(a,b,c) (min(min(a,b),c))
#define BUG cout<<"BUG! "<<endl
#define line cout<<"--------------"<<endl
#define L(t) (t << 1)
#define R(t) (t << 1 | 1)
#define Mid(a,b) ((a + b) >> 1)
#define lowbit(a) (a & -a)
#define FIN freopen("in.txt","r",stdin)
#define FOUT freopen("out.txt","w",stdout)
#pragma comment (linker,"/STACK:102400000,102400000") // typedef long long LL;
// typedef unsigned long long ULL;
// typedef __int64 LL;
// typedef unisigned __int64 ULL;
// int gcd(int a,int b){ return b?gcd(b,a%b):a; }
// int lcm(int a,int b){ return a*b/gcd(a,b); } /********************* F ************************/ int ma[MAXN][MAXN];
bool vis[MAXN][MAXN];
int ax[] = {-,-,-,,,,,};
int ay[] = {-,,,-,,-,,};
int SG[MAXN*MAXN];
int n,m,k;
int check(int xx,int yy){
if(xx >= && xx < n && yy >= && yy < m) return true;
return false;
}
int bfs(pair<int,int> s){
queue< pair<int,int> > q;
int ct = ;
q.push(s);
while(!q.empty()){
for(int i = ; i < ; i++){
int xx = q.front().first + ax[i];
int yy = q.front().second + ay[i];
if(check(xx,yy)){
if(ma[xx][yy] == && !vis[xx][yy])
q.push(make_pair(xx,yy));
else if(ma[xx][yy] == && !vis[xx][yy])
ct++;
vis[xx][yy] = true;
}
}
q.pop();
}
return ct;
}
int main()
{
//FIN;
//FOUT;
int T;
cin>>T;
for(int cas = ; cas <= T; cas++){
memset(ma,,sizeof(ma));
memset(vis,false,sizeof(vis));
memset(SG,,sizeof(SG));
scanf("%d%d%d",&n,&m,&k);
for(int ck = ; ck < k ; ck++){
int a,b;
scanf("%d%d",&a,&b);
ma[a][b] = ;
for(int i = ; i < ; i++){
if(check(a+ax[i],b+ay[i]) && ma[a+ax[i]][b+ay[i]] != )
ma[a+ax[i]][b+ay[i]] = ;
}
}
int cnt = ;
for(int i = ; i < n ; i++){
for(int j = ; j < m ; j++){
if(ma[i][j] == && !vis[i][j]){
vis[i][j] = true;
SG[cnt++] = (bfs(make_pair(i,j)) + ) % == ? : ;
}
}
}
for(int i = ; i < n ; i++){
for(int j = ; j < m ; j++){
if(ma[i][j] == && !vis[i][j]){
vis[i][j] = true;
SG[cnt++] = ;
}
}
}
int res = SG[];
for(int i = ; i < cnt ; i++){
res = res ^ SG[i];
}
if(res == ) printf("Case #%d: Fanglaoshi\n",cas);
else printf("Case #%d: Xiemao\n",cas);
}
return ;
}

HDU 4678 Mine SG博弈的更多相关文章

  1. HDU 4678 Mine (2013多校8 1003题 博弈)

    Mine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  2. hdu 4678 Mine

    HDU 4678 把点开空地时会打开的一大片区域看成一块,题目中说到,在一盘游戏 中,一个格子不可能被翻开两次,说明任意两块空地不会包含相同的格子. 那么就可以看成一个组合游戏. 当空地旁边没连任何数 ...

  3. HDU 1848(sg博弈) Fibonacci again and again

    Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  4. HDU 4678 Mine(博弈)

    Mine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submi ...

  5. HDU 1536 S-Nim SG博弈

    S-Nim Problem Description   Arthur and his sister Caroll have been playing a game called Nim for som ...

  6. hdu 4678 Mine 博弈论

    这是一题简单的博弈论!! 所有的空白+边界的数字(个数为n)为一堆,容易推出其SG函数值为n%2+1: 其他所有的数字(个数为m)的SG值为m%2. 再就是用dfs将空白部分搜一下即可!(注意细节) ...

  7. hdu 4778 Gems Fight! 博弈+状态dp+搜索

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...

  8. HDU 1525 类Bash博弈

    给两数a,b,大的数b = b - a*k,a*k为不大于b的数,重复过程,直到一个数为0时,此时当前操作人胜. 可以发现如果每次b=b%a,那么GCD的步数决定了先手后手谁胜,而每次GCD的一步过程 ...

  9. UVA12293 Box Game —— SG博弈

    题目链接:https://vjudge.net/problem/UVA-12293 题意: 两人玩游戏,有两个盒子,开始时第一个盒子装了n个球, 第二个盒子装了一个球.每次操作都将刷量少的盒子的球倒掉 ...

随机推荐

  1. c# protected public private internal

    1 internal 只能在一个项目中引用,不能跨项目引用,只有在同一程序集的文件中 2 public 最高级别的访问权限 对访问公共成员没有限制 3 private 最低级别的访问权限 只能在声明它 ...

  2. UI Framework-1: Ash Color Chooser

    Ash Color Chooser Overview This document describes how to achieve <input type=”color”> UI in C ...

  3. gitHub上如何设置或者取消电子邮箱提醒

    原文链接:点我 我们正常注册的gitHub一般应该都是电子邮箱的方式,在注册账号时可能选择或者默认给了各种提醒,但是gitHub的邮箱提醒真的就比较烦人了,特别是最近团队开发项目,什么动态都有提醒,就 ...

  4. 题解 HDU1565 【方格取数(1)】

    给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. 题目清晰明了,这道题应该用 ...

  5. 【Educational Codeforces Round 37 C】 Swap Adjacent Elements

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然l..r这一段连续的1可以把l..r+1变成有序的. 那么就把所有的连续1段变成有序的就好. 看看最后是不是升序即可. [代码] ...

  6. 【转载】GitHub详细教程

    1 Git详细教程   1.1 Git简介   1.1.1 Git是何方神圣?   Git是用C语言开发的分布版本控制系统.版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历 ...

  7. Kinect for Windows V2 SDK+ VS2012 环境搭建

    眼下使用的SDK版本号是KinectSDK-v2.0-PublicPreview1409-Setup.exe. 下载地址:http://www.microsoft.com/en-us/download ...

  8. 8.不绑定(ngNonBindable)

    转自:https://www.cnblogs.com/best/tag/Angular/ ngNonBindable指令告诉Angular编译或绑定当前DOM元素的内容.这对于要求Angular忽略那 ...

  9. 18. IDEA 添加 persistence 时没有 sessionFactory

    转自:http://www.voidcn.com/article/p-rryjfhwi-e.html IDEA 添加 persistence 时没有 sessionFactory 点击项目,然后F4 ...

  10. BootstrapDialog模态框

    5最近是比较烦直接使用Bootstrap里面的模态框,满屏都是模态框代码,看得心烦.然后想起以前使用的BootstrapDialog.show()的方式,挺简单好用的.然后就拿出来分享一下. 1.下载 ...