很有意思,很好的题目。

这样的,一个n*m的扫雷地图,告诉你哪些地方是有雷的。一个人如果点在了空白处,那么与其相邻的(八个方向)的数字以及空白都会递归地显示出来,如果点在数字上面,那么就只会显示这一个数字。

游戏过程中,谁第一个无法点开一个非雷的格子算输。

这、、、、其实可以看成是nim博弈问题,但是有一点点点点的不同。

我们由于题目说明了数字的部分不会有重复的,所以我们把一个由空白部分连成的区域看成是一堆石子,那么有的单独的数字就是一堆石子且只有一颗。

同时我们把所有的空白区域看成是一个石子,这样问题就转化为了给你N堆石子,以及每一堆的石子的数量,现在要你求出博弈的结果是先手胜还是后手胜?

由于每次可选择的可以使一堆中的某一颗石子,也可以是一整堆的石子,所以这与单纯的nim博弈是有所区别的。

其实可以这样来考虑这个问题。

我们分别统计出石子数量为奇数的堆有多少个(x)、石子数为偶数的堆有多少个(y)。

那么其实,除非x和y均为偶数,否则先手必胜。

这样来理解,其实博弈过程中,必胜者只要一直维护所有的石子数之和为偶数即可。

但是如果是一开始就为偶数偶数的话,那么就是必输了。

不知道这么理解对不对呢?

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1010
using namespace std; int a[maxn][maxn],t,n,m,k,xi,yi,ans,cas=,tot,flag;
bool b[maxn][maxn],vis[maxn][maxn]; int dfs(int x,int y)
{
if (a[x][y]==- || x< || x>n || y< || y>m) return ;
if (b[x][y]) return ;
b[x][y]=true;
if (a[x][y]!=) return ;
return dfs(x+,y)+dfs(x-,y)+dfs(x,y+)+dfs(x,y-)+dfs(x-,y-)+dfs(x-,y+)+dfs(x+,y-)+dfs(x+,y+);
} int main()
{
scanf("%d",&t);
while (t--)
{
memset(a,,sizeof a);
memset(b,false,sizeof b);
memset(vis,false,sizeof vis);
scanf("%d%d%d",&n,&m,&k);
tot=;
while (k--)
{
scanf("%d%d",&xi,&yi);
xi+=,yi+=;
vis[xi][yi]=true;
}
for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
{
if (vis[i][j])
{
a[i][j]=-;
continue;
}
a[i][j]=;
for (int ii=-; ii<=; ii++)
for (int jj=-; jj<=; jj++)
if (vis[i+ii][j+jj]) a[i][j]++;
}
ans=;
for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
{
if (b[i][j]) continue;
if (a[i][j]==)
{
int tep=dfs(i,j)+;
if (tep&) ans^=;
else ans^=;
tot++;
}
}
for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
{
if (b[i][j]) continue;
if (a[i][j]==-) continue;
b[i][j]=true;
ans^=;
tot++;
}
if (ans) printf("Case #%d: Xiemao\n",++cas);
else printf("Case #%d: Fanglaoshi\n",++cas);
}
return ;
}

HDU4678_Mine的更多相关文章

随机推荐

  1. 2017-2018-1 20155320 《信息安全系统设计基础》第四周学习总结(课堂实践补交+myhead与mytail加分项目)

    2017-2018-1 20155320 <信息安全系统设计基础>第四周学习总结(课堂实践补交+myhead与mytail实现) 课堂实践内容 1 参考教材第十章内容 2 用Linux I ...

  2. NetWork——TCP的流量控制和拥塞控制

    ,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大. 这里为什么替换掉了慢开始算法呢,这是因为收到重复的ACK不仅仅告诉我们一个分组丢失了,由于接收方只有在收到另一个报文段时才会产生重复的ACK,所 ...

  3. PostgreSQL参数学习:random_page_cost

    磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页    回到顶级页面:PostgreSQL索引页[作者 高健@博客园  luckyjackgao@g ...

  4. zedboard学习(1)OLED驱动显示图像

    1. 干点啥?驱动一下上面的屏吧 2. 找个代码研究一下,cat命令用于读取文件(普通文件或设备文件)的内容并进行输出.据说板子已经做好OLED的驱动了,驱动映射为/dev/zed_oled,所以直接 ...

  5. 【python笔记】python中的list、tuple、set、dict用法简析

    list list是一种有序的集合(或称作列表),可以很方便地添加和删除其中的元素. >>> classmates = ['Michael', 'Bob', 'Tracy'] 可通过 ...

  6. mono for andorid第一个小应用

    先上图 这个小应用根据两人的姓名算出两人的关系,当然仅仅娱乐. 本来想多写写,但是实在觉得没什么可写的,而且本人正处于感冒状态,脑袋不怎么灵光,所以就不写那么多废话了. 安装mono的话,就上吾乐吧软 ...

  7. appium+python自动化☞appium python api大全

    整理了一些常用的appium python api,供学习使用...

  8. vue异步分页+初始化页面

    html代码: <section class="container page-home"> <div id="main-content" cl ...

  9. fastdfs+nginx+image_filter安装与生成缩略图

    fastdfs简介 类似google FS的一个轻量级分布式文件系统,纯C实现,支持linux.FreeBSD等UNIX系统: 只能通过API访问,不支持POXIS: 文件不分块存储,上传的文件和OS ...

  10. Python+MySQL开发医院网上预约系统(课程设计)一

    一:开发环境的配置 1:桌面环境为cnetos7+python2.7 2:MySQL的安装与配置 1)MySQL的安装 MySQL官方文档: http://dev.mysql.com/doc/mysq ...