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. 51Nod 1433 0和5(数论)

    小K手中有n张牌,每张牌上有一个一位数的数,这个字数不是0就是5.小K从这些牌在抽出任意张(不能抽0张),排成一行这样就组成了一个数.使得这个数尽可能大,而且可以被90整除. 注意: 1.这个数没有前 ...

  2. Data flow diagram-数据流图

    A DFD shows what kind of information will be input to and output from the system, how the data will ...

  3. WHU 1540 Fibonacci 递推

    武大邀请赛的网络预选赛,就去做了个签到题,居然连这个递推都没推出来,真是惭愧. 而且好久没写矩阵乘法了,来回顾一下. 题意: 求Fibonacci数列的,前n项立方和. 思路: 可以求得一下递推公式: ...

  4. hihoCoder #1127 : 二分图二·二分图最小点覆盖和最大独立集

    #1127 : 二分图二·二分图最小点覆盖和最大独立集 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 在上次安排完相亲 ...

  5. 一张图片让你了解android的事件分发机制

  6. 7-07. PAT排名汇总(25) (结构体 ZJU_PAT)

    题目链接:http://www.patest.cn/contests/ds/7-07 编程能力測试(Programming Ability Test,简称PAT)是浙江大学计算机科学与技术学院主办的专 ...

  7. Ubuntu 13.04/CentOS 6.4 下C++开发时的相关设置

    Ubuntu 13.04/CentOS 6.4 下C++开发时的相关设置 一.基本设置 首先,为了可以使我们的c++ 可以找到 iostream类,std标准库,我们需要在C/C++ General- ...

  8. Flutter入门

    1.安装SDK 官网下载其最新可用的安装包并解压. 设置环境变量:在.bash_profile文件中写入export PATH=/Users/malk/Documents/flutter/bin:$P ...

  9. Linux远程远程控制程序TeamViewer

    TeamViewer 软件我就不介绍了,相信进行远程管理的人都知道它. 1.安装: Linux个发行版因软件管理方式不同而不同,先通过软件管理从自己的软件仓库进行搜索安装如果有就进行安装,没有通过官网 ...

  10. FreeBSD是UNIX系统的重要分支,其命令与Linux大部分通用,少部分是其特有。

    FreeBSD是UNIX系统的重要分支,其命令与Linux大部分通用,少部分是其特有. 1: man 在线查询 man ls2: ls 查看目录与档案 ls -la3: ln 建立链接文件 ln -f ...