hdu 4678 Mine
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的更多相关文章
- HDU 4678 Mine SG博弈
http://acm.hdu.edu.cn/showproblem.php?pid=4678 自己太蠢...没学SG...还是浩神指点我SG精髓以后才A的这题...(第一题SG 这里子游戏之间没有影响 ...
- HDU 4678 Mine (2013多校8 1003题 博弈)
Mine Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- HDU 4678 Mine(博弈)
Mine Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submi ...
- hdu 4678 Mine 博弈论
这是一题简单的博弈论!! 所有的空白+边界的数字(个数为n)为一堆,容易推出其SG函数值为n%2+1: 其他所有的数字(个数为m)的SG值为m%2. 再就是用dfs将空白部分搜一下即可!(注意细节) ...
- 2020杭电多校 10C / HDU 6879 - Mine Sweeper (构造)
HDU 6879 - Mine Sweeper 题意 定义<扫雷>游戏的地图中每个空白格子的值为其周围八个格子内地雷的数量(即游戏内临近地雷数量的提示) 则一张地图的值\(S\)为所有空白 ...
- hdu 4678
HDU 4768: Flyer 题意: 有N个社团,每个社团三个属性A,B,C,表示会向编号A+k*C的同学发传单(k=0,1,2... && A+k*C <= B).题目保证 ...
- 2020杭电多校 C / HDU 6879 - Mine Sweeper
题意: t组输入,每组输入一个s 你需要输出一个r行c列的阵列,这个阵列中'X'代表炸弹,'.'表示没有炸弹 对于'.'这些位置都会有一个数值,这个值取决于这个位置附近8个位置,这8个位置一共有几个炸 ...
- 【 2013 Multi-University Training Contest 8 】
HDU 4678 Mine 对于每个空白区域,求SG值. 最后异或起来等于0,先手必败. #pragma comment(linker,"/STACK:102400000,102400000 ...
- 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 ...
随机推荐
- 解决 Flask-sqlalchemy 中文乱码
当在使用 flask-sqlalchemy 操作 mysql 数据库时中文乱码或者直接报错. 解决方法如下: from flask_sqlalchemy import SQLAlchemy db = ...
- 使用 key 登录时分开记录操作历史记录
线上服务器一般都是配置 key 登录,一个账号可以多个工作人员连接,操作命令历史却全部记录在一个文件中,当然后查看某条命令是谁执行的时候就不好查了.这时候我们就可以通过配置 histroy 相关环境变 ...
- (转)setTextColor()的参数设置方式
setTextColor()的参数设置方式 分类: Android界面研究2011-12-09 23:27 11160人阅读 评论(2) 收藏 举报 查了下资料发现setTextColor()的参数应 ...
- 利用全局变量$_SESSION和register_shutdown_function自定义会话处理
register_shutdown_function 可以注册一个自定义的函数,在程序运行结束之前 执行. 在做ecshop的二次开发过程中,虽然代码 太老太乱太冗余,但ec的会话处理的设计感觉还是不 ...
- linux下通过sysfs操作GPIO
linux下通过sysfs操作GPIO 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的.其实linux下面有一个通用的GPIO操作接口,那就是 ...
- Linux下的Memcache安装,启动
一.linux安装memcache 1. 如果通过下载源码进行安装,则需要下载最新版本http://memcached.googlecode.com/files/memcached-1.4.13.ta ...
- git rebase 与 merge(个人使用理解)
merge 是“合并”,rebase.cherry-pick 中文能理解成“重现” merge 一般是对于整个分支做处理,比如一个feature分支,功能开发完成经过测试了,我们会合并(merge)到 ...
- PL/SQL 训练04--事务
--pl/sql通过SQL和ORACLE数据库紧密的整合在一起--在pl/sql中可以执行任何操作语句(DML语句),包括INSERT,UPDATE,DELETE,MERGE,也包括查询语句--可否执 ...
- UseSubmitBehavior="false" 防止页面重复提交bug
OnClientClick="this.disabled=true;" UseSubmitBehavior="false" 注: 1.当设置UseSubmitB ...
- springboot成神之——spring文件下载功能
本文介绍spring文件下载功能 目录结构 DemoApplication WebConfig TestController MediaTypeUtils 前端测试 本文介绍spring文件下载功能 ...