很有意思,很好的题目。

这样的,一个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. 20155313 2016-2017-2《Java程序设计》课程总结

    20155313 2016-2017-2<Java程序设计>课程总结 目录 一.每周作业链接汇总 二.实验报告链接汇总 三.代码托管链接 四.课堂项目实践 五.课程收获与不足 六.问卷调查 ...

  2. 20155317 2016-2017-2《Java程序设计》课程总结

    20155317 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 新玮的首发博客:对师生关系的期望. C语言与java 20155317 王新玮第二次:语言掌握调查 ...

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

    20155338 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 本周学习量比较多,但是知识点并不是特别难,学习了书本的第四五章,其中个人重点学习了数组对象. ...

  4. CentOS 6.8 curl支持的NSS修改为OpenSSL的方法

    在CentOS 6.8的系统里面的curl支持的https是nss版本的,而不是openssl,所以在php使用curl访问https的时候会报Unable to load client key -8 ...

  5. HBase第一章 安装 HMaster 主备

    1.集群环境 Hadoop HA 集群规划 hadoop1 cluster1 nameNode  HMaster hadoop2 cluster1 nameNodeStandby ZooKeeper ...

  6. Intellij IDEA 热部署插件Jrebel激活

    激活前请确保已经安装好了Jrebel插件,本文通过反向代理激活. 第一步:下载激活工具(即代理工具),下载地址:https://github.com/ilanyu/ReverseProxy/relea ...

  7. TensorFlow深度学习实战---图像数据处理

    图像的亮度.对比度等属性对图像的影响非常大,这些因素都会影响最后的识别结构.当然,复杂的预处理过程可能会导致训练效率的下降(利用TensorFlow中多线程处理输入数据的解决方案). 同一不同的原始数 ...

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

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

  9. [network]数字签名

    数字签名(又称公钥数字签名.电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证. ...

  10. 算法与AI的暗黑面:3星|《算法的陷阱:超级平台、算法垄断与场景欺骗》

    算法的陷阱:超级平台.算法垄断与场景欺骗 全书讲算法与AI的暗黑面:价格歧视.导致算法军备竞赛.导致商家降价冲动降低.平台作恶(向劣质商家收费导致品质下降.与开发商一起分析用户隐私)等. 作者从商业. ...