HDU 4678

把点开空地时会打开的一大片区域看成一块,题目中说到,在一盘游戏

中,一个格子不可能被翻开两次,说明任意两块空地不会包含相同的格子。

那么就可以看成一个组合游戏。

当空地旁边没连任何数字的时候,sg = 1(直接转移到 0)。如果有一个

数字,点空地可以转移到 0,点数字可以转移到 1,所以 sg = 2。有 2 个数

字点空地转移到 0,点数字转移到 2,所以 sg = 1。

以此类推,空地旁边有奇数个数字的时候,sg = 2,否则 sg = 1。

剩下的没与空地相连的数字,每个的 sg 都是 1。

那么将所有空地的 sg 异或起来,再异或 (不与空地相连的数字个数对 2

取模),等于零输出后手赢,大于 0 输出先手赢即可。

#include<stdio.h>
#include<string.h>
#pragma comment(linker,"/STACk:1024000000,1024000000")
int map[][];
//bool flag[1100][1100];
int f[][]= {{,},{,-},{-,},{-,},{-,-},{,-},{,},{,}};
int n,m;
int tmp;
int dfs(int i,int j)
{
map[i][j]=;
for(int k=; k<; k++)
{
int x=i+f[k][];
int y=j+f[k][];
if(x>=&&y>=&&x<m&&y<n)
{
if(map[x][y]==)
{
map[x][y]=;
tmp++;
}
else if(!map[x][y])dfs(x,y);
}
}
return ;
}
void myprintf()
{
for(int i=;i<m;i++)
{ for(int j=;j<n;j++)
printf("%d ",map[i][j]);
printf("\n");
} }
int main()
{
int _case,ij;
int ki,i,j,xi,yi;
scanf("%d",&_case);
for(ij=; ij<=_case; ij++)
{
memset(map,,sizeof(map));
int ans=;
scanf("%d%d%d",&m,&n,&ki);
for(i=; i<ki; i++)
{
scanf("%d%d",&xi,&yi);
map[xi][yi]=;
for(int k=; k<; k++)
{
int x=xi+f[k][];
int y=yi+f[k][];
if(x>=&&y>=&&x<m&&y<n)
{
if(!map[x][y])map[x][y]=;
}
}
}
for(i=;i<m;i++)
{
for(j=;j<n;j++)
if(!map[i][j])
{
tmp=; dfs(i,j);
//printf("##%d\n",tmp);
if(tmp&)ans^=;
else ans^=;
}
} int ans1=;
//int ans2=0;
//myprintf();
for(i=;i<m;i++)
{
for(j=;j<n;j++)
{
if(map[i][j]==)ans1++;
}
}
ans1%=;
ans^=ans1;
printf("Case #%d: ",ij);
if(ans)printf("Xiemao\n");
else printf("Fanglaoshi\n");
}
return ;
}
/*
//求sg函数值代码如下
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 1111
int sg[maxn];//sg[i]表示由一个空白区域加上i-1个边缘数字区的sg值
int vis[maxn];
void init()
{
int i,j,k;
sg[0]=0;
sg[1]=1;
for(i=2;i<1000;i++)
{
memset(vis,0,sizeof(vis));
vis[sg[i-1]]=1; //点击数字区域
vis[0]=1; //点击空白区域,后继状态必败
for(j=0;;j++)
if(vis[j]==0)
{
sg[i]=j;
break;
}
}
for(i=0;i<20;i++)
cout<<sg[i]<<" ";
cout<<endl;
}
int main()
{
init();
return 0;
}
//SG值:0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
*/

hdu 4678 Mine的更多相关文章

  1. HDU 4678 Mine SG博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=4678 自己太蠢...没学SG...还是浩神指点我SG精髓以后才A的这题...(第一题SG 这里子游戏之间没有影响 ...

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

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

  3. HDU 4678 Mine(博弈)

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

  4. hdu 4678 Mine 博弈论

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

  5. 2020杭电多校 10C / HDU 6879 - Mine Sweeper (构造)

    HDU 6879 - Mine Sweeper 题意 定义<扫雷>游戏的地图中每个空白格子的值为其周围八个格子内地雷的数量(即游戏内临近地雷数量的提示) 则一张地图的值\(S\)为所有空白 ...

  6. hdu 4678

    HDU 4768: Flyer 题意: 有N个社团,每个社团三个属性A,B,C,表示会向编号A+k*C的同学发传单(k=0,1,2...  && A+k*C <= B).题目保证 ...

  7. 2020杭电多校 C / HDU 6879 - Mine Sweeper

    题意: t组输入,每组输入一个s 你需要输出一个r行c列的阵列,这个阵列中'X'代表炸弹,'.'表示没有炸弹 对于'.'这些位置都会有一个数值,这个值取决于这个位置附近8个位置,这8个位置一共有几个炸 ...

  8. 【 2013 Multi-University Training Contest 8 】

    HDU 4678 Mine 对于每个空白区域,求SG值. 最后异或起来等于0,先手必败. #pragma comment(linker,"/STACK:102400000,102400000 ...

  9. hdu 4739 Zhuge Liang's Mines 随机化

    Zhuge Liang's Mines Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.p ...

随机推荐

  1. ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  2. Hadoop体系结构之 HDFS

    HDFS采用主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的(在最新的Hadoop2.2版本已经实现多个NameNode的配置-这也是一 ...

  3. ror中间一些单复数的规则

    基于rails generate生成的东西里面,有一些单复数的规则刚开始很不理解,觉得很复杂,容易弄错,特此记录 model 实际是对于数据库数据的对象化,只体现单个对象,比如模型user有name和 ...

  4. Oracle 数据库备份还原(Expdp/impdp)记录

    最近公司将原数据库服务器切换.之前没整过这块,也是一堆的度娘.经过不停的摸索,终于成功了.现在将这份艰辛记录下来,方便自己以后查阅的同时,方便有类似需求的同学参考. 我们此次切换共分:ERP.LOS. ...

  5. mysql复制(高可用架构方案的基础)

    mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程特点:1.没有改变就无所谓复制 ;改变是复制的根本与数据源2.所有的改变:是指可以复制全部改变,也可以复制部分改变 可以 ...

  6. Linux: How to delete a disk or LUN reference from /dev

    In AIX, there is rmdev command to remove a disk/LUN from /dev directory i.e to make the disk/LUN una ...

  7. .net中webconfig自定义配置

    在configuration节点,也就是文件的根节点下,增加如下节点 <appSettings> <!--<add key="propPath" value ...

  8. MySQL router

    MySQL Router is a building block for high availability (HA) solutions. It simplifies application dev ...

  9. linux输入子系统概念介绍

    在此文章之前,我们讲解的都是简单的字符驱动,涉及的内容有字符驱动的框架.自动创建设备节点.linux中断.poll机制.异步通知.同步互斥.非阻塞.定时器去抖动. 上一节文章链接:http://blo ...

  10. Python多线程-事件

    线程事件用于线程控制线程,实现多个进程间的交互,线程事件的初始值为False set:将线程事件的值设为True clear:将线程事件的值设为False # -*- coding:utf-8 -*- ...