HDU4678_Mine
很有意思,很好的题目。
这样的,一个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的更多相关文章
随机推荐
- 20155307 2016-2017 《Java程序设计》第三次实验报告
(一)敏捷开发与XP 敏捷开发是一种以人为核心.迭代.循序渐进的开发方法."敏捷流程"是一系列价值观和方法论的集合.从2001年开始,一些软件界的专家开始倡导"敏捷&qu ...
- WPF 窗口句柄获取和设置
原文:WPF 窗口句柄获取和设置 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83347163 ...
- 【MongoDB】如何注册windows服务
一.为什么要注册windows服务 mongodb启动比较麻烦,每次都要cmd去开启.注册windows服务,可以设置开机启动,比较友好. 二.如何注册windows服务 1.安装mongodb 2. ...
- Windows下安装RaibbitMQ
1.软件准备 1.1 erlang语言包 到http://www.erlang.org/download.html下载,并且运行! 安装目录C:\Program Files (x86)\erl5.10 ...
- 如何在makfile中查看变量的值
在makefile中查看变量的取值是多少应该是一个比较麻烦的问题,但是本大神自己研究出一个十分方便的方法.这个方法十分简单.现在介绍如下 如果在一个十分复杂庞大的makefile文件中,有个地方用到一 ...
- ubuntu apt-xxx
1. apt-get install xxx 2. dpkg -l ; list software already installed. 3. apt-cache dumpavail ; print ...
- 人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门
人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门 上篇博文我们准备好了2000张训练数据,接下来的几节我们将详细讲述如何利用这些数据训练我们的识别模型.前面说过,原博文给出的训练 ...
- Docker入门与实践之 docker安装与了解
一.Docker 概述 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...
- ExpressJS基础概念及简单Server架设
NodeJS Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.js 的包 ...
- hbase Problem binding to node1/192.168.1.13:16020 : 地址已在使用
这是hbase 从0.9.x升级到1.x后HMaster与HRegionServer端口冲突问题 在hbase升级到1.0.0版本后,默认端口做了改动.其中16020端口是hmaster服务和hreg ...