很有意思,很好的题目。

这样的,一个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. # 20155224 课堂实践 MyOD

    20155224 课堂实践 MyOD 要求 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 提交测试代码和运行结果截图,加上学号水印,提交码云代 ...

  2. 20155227 2016-2017-2 《Java程序设计》第三周学习总结

    20155227 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 类与对象 使用Java撰写程序几乎都在使用对象,要产生对象必须先定义类,类是对象的设计图,对 ...

  3. 随笔三 安装Linux操作系统

    一.虚拟机安装Ubuntu图文教程]在自己笔记本上安装Linux操作系统 我参考了VirtualBox虚拟机安装Ubuntu的图文教程,根据图片和所附内容一步步的将虚拟机安装到位,没看安装教程之前完全 ...

  4. 20155317 实验二 Java面向对象程序设计

    20155317 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...

  5. # 20155327 2016-20017-3 《Java程序设计》第3周学习总结

    教材学习内容总结 第四章 认识对象 区分基本类型与类类型 基本类型: 1.整数:包括int,short,byte,long ,初始值为0 2.浮点型:float,double ,初始值为0.0 3.字 ...

  6. asp.net self host and urlacl(解决UnHandledException Message:拒绝访问的问题)

    命令提示符(管理员权限)需要添加的代码: netsh http add urlacl url=http://*:9999/ user=Everyone listen=yes 其中: url:代码中的u ...

  7. PostgreSQL的hstore初步学习

    安装hstore: 进入源代码的 /contrib/hstore 目录,然后执行gmake 和 gmake install: [root@pg200 hstore]# gmake gcc -O2 -W ...

  8. Yii 2.0 使用片段缓存

    网站首页footer中的菜单标题是从数据库读取并显示处理的. 也就是 <footer>标题里面是foreach.这样每个人打开网站就查询遍历效率会很低. <footer class= ...

  9. Web自动化常用方法封装(不定时更新)

    /** * JScript实现鼠标悬停 */public void mouseHoverJScript(By by,WebElement HoverElement) { // TODO Auto-ge ...

  10. 240. 搜索二维矩阵 II

    二维数组搜索 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 ...