很有意思,很好的题目。

这样的,一个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. 20155233 2016-2017-2 《Java程序设计》第1周学习总结

    20155233 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 本周主要学习教材的第一章.第二章,了解了Java的发展历程,最基本的Java环境的搭建,以及 ...

  2. 最简单的rman操作

    连接: [root@oracle000 ‾]# su - oracle [oracle@oracle000 ‾]$ rman target / lines) Recovery Manager: Rel ...

  3. 9.15 DP合集水表

    9.15 DP合集水表 显然难了一些啊. 凸多边形的三角剖分 瞄了一眼题解. 和蛤蛤的烦恼一样,裸的区间dp. 设f[i][j]表示i~j的点三角剖分最小代价. 显然\(f[i][i+1]=0,f[i ...

  4. Maven学习(十七)-----Maven外部依赖

    Maven外部依赖 正如大家所了解的那样,Maven确实使用 Maven 库的概念作依赖管理.但是,如果依赖是在远程存储库和中央存储库不提供那会怎么样? Maven 提供为使用外部依赖的概念,就是应用 ...

  5. java 通过内存映射文件来提高IO读取文件性能

    MappedByteBuffer out = new RandomAccessFile("src/demo20/test.dat", "rw"). getCha ...

  6. 测试面试必会sql(1)

    测试一般各种查询语句用的较多,下面的查询语句都是需要熟悉的 Course表 Score表 Student表 Teacher表 1,查询课程编号为“02”的总成绩 SELECT * FROM `Scor ...

  7. 抓包工具Charles学习总结

    最近由于工作需要对App进行测试,功能方面还好说,但是在网络测试方面遇到了一些问题.由于公司App是使用https进行通信,直接在路由器上抓包下来,数据包都是加密的,没法看到接口返回的内容,给测试的B ...

  8. Linux 安装Redis<集群版>(使用Mac远程访问)

    阅读本文需要先阅读安装Redis<准备> 一 架构细节 所有的redis节点彼此互联(PING-PONG机制) 内部使用二进制协议优化传输速度和带宽 节点的fail是通过集群中超过半数的节 ...

  9. spring 属性文件加载接口---PropertySourceLoader

    org.springframework.boot.config Interface PropertySourceLoader 实现类: PropertiesPropertySourceLoader, ...

  10. Python基础入门(迭代器和生成器)

    1 Python迭代器 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退. 迭代器有两个基本的方法:iter() 和 ...