【题解】JSOI2009游戏
真的没想到、、、果然反应太迟钝,看到题目毫无思路,一点联想都没有。
按照网上博客的说法:一眼棋盘染色二分->二分图->最大匹配->BINGO?果然我还是太弱了……
我们将棋盘黑白染色,相邻两点之间的转移转化为图上的边。根据最大匹配的定义,如果我们最开始将棋子放在一个未匹配的点上,一定会到达一个匹配点(不然若到达了另一个未匹配点就说明还有可以扩张的匹配。)此后,因为已经是最大匹配所以不存在可以增广的交替路。所以这样先手一定会比后手多走一步,获得胜利。所以问题转化为:有哪些点不在最大匹配上?注意最大匹配的情况数是很多的。
所以我们枚举每一个点是否可以不被纳入最大匹配,若可以,说明是一个先手必胜点。
#include <bits/stdc++.h>
using namespace std;
#define maxn 205
int n, m, a[maxn][maxn], link[maxn * ];
int Map[maxn * ][], ans[maxn * ][];
int cnt, tot, id[maxn][maxn];
int px[] = { , , -, }, py[] = { , , , - };
bool vis[maxn * ];
char s[maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} bool dfs(int u)
{
for(int i = ; i <= Map[u][]; i ++)
{
int v = Map[u][i];
if(vis[v]) continue; vis[v] = ;
if(!link[v] || dfs(link[v]))
{ link[v] = u, link[u] = v; return ; }
}
return ;
} void add(int u, int v) { Map[u][++ Map[u][]] = v; } int main()
{
n = read(), m = read();
for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
id[i][j] = ++ cnt;
for(int i = ; i <= n; i ++)
{
scanf("%s", s + );
for(int j = ; j <= n; j ++)
if(s[j] == '#') a[i][j] = ;
}
for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
if(!a[i][j] && (i + j) % )
for(int k = ; k <= ; k ++)
{
int mx = i + px[k], my = j + py[k];
if(mx >= && mx <= n && my >= && my <= m && !a[mx][my])
{
add(id[i][j], id[mx][my]);
add(id[mx][my], id[i][j]);
}
}
for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
if(!a[i][j] && (i + j) % )
{
memset(vis, , sizeof(vis));
if(dfs(id[i][j])) cnt ++;
}
for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
if(!a[i][j])
{
memset(vis, , sizeof(vis)); vis[id[i][j]] = ;
if(!link[id[i][j]] || dfs(link[id[i][j]]))
{
ans[++ tot][] = i, ans[tot][] = j;
link[id[i][j]] = ;
}
}
if(!tot) printf("LOSE");
else
{
printf("WIN\n");
for(int i = ; i <= tot; i ++)
printf("%d %d\n", ans[i][], ans[i][]);
}
return ;
}
【题解】JSOI2009游戏的更多相关文章
- BZOJ1443: [JSOI2009]游戏Game
如果没有不能走的格子的话,和BZOJ2463一样,直接判断是否能二分图匹配 现在有了一些不能走的格子 黑白染色后求出最大匹配 如果是完备匹配,则无论如何后手都能转移到1*2的另一端,故先手必输 否则的 ...
- JSOI2009 游戏
1443: [JSOI2009]游戏Game Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 557 Solved: 251[Submit][Stat ...
- BZOJ:1443: [JSOI2009]游戏Game
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1443 反正不看题解我是完全想不出系列…… 先把棋盘黑白染色,也就是同一对角线上颜色相同,使 ...
- BZOJ1443 [JSOI2009]游戏Game 【博弈论 + 二分图匹配】
题目链接 BZOJ1443 题解 既然是网格图,便可以二分染色 二分染色后发现,游戏路径是黑白交错的 让人想到匹配时的增广路 后手要赢[指移动的后手],必须在一个与起点同色的地方终止 容易想到完全匹配 ...
- BZOJ:[JSOI2009]游戏Game【二分图匹配乱搞】
题目大意:n*m的棋盘,其中有些区域是禁区,两个人在棋盘上进行博弈,后手选择棋子的初始位置,然后先后手轮流将棋子往上下左右移动,走过的区域不能再走,问能否有一个位置使得后手必胜 Input 输入数据首 ...
- [JSOI2009]游戏Game
Description Input 输入数据首先输入两个整数N,M,表示了迷宫的边长. 接下来N行,每行M个字符,描述了迷宫. Output 若小AA能够赢得游戏,则输出一行"WIN&quo ...
- 【BZOJ】1443: [JSOI2009]游戏Game
[算法]博弈论+二分图匹配(最大流) [题解]方格图黑白染色得到二分图, 二分图博弈:当起点不属于某个最大匹配时,后手必胜. 问题转化为那些点不属于某个最大匹配. 先找到一个最大匹配,非匹配点加入答案 ...
- [JSOI2009]游戏 二分图博弈
题面 题面 题解 二分图博弈的模板题,只要会二分图博弈就可以做了,可以当做板子打. 根据二分图博弈,如果一个点x在某种方案中不属于最大匹配,那么这是一个先手必败点. 因为对方先手,因此我们就是要找这样 ...
- 【BZOJ1443】[JSOI2009]游戏Game(二分图+博弈)
BZOJ 题意: 给出一个\(n*m\)的网格,其中有一些障碍点. 现在两个人玩游戏,首先先手选定一个点,然后从后手开始轮流移动,不能移动者即输掉这次游戏. 规定不能移动到那些之前已经到过的格子上. ...
随机推荐
- js文件处理File
支持File API的浏览器有IE10+,Firefox3.5+,Opera10.6+,Safari5+,Chrome. 1.在表单元素上<input type="fiel" ...
- 【linux下dhcp服务的简单搭建及优化部署】
dhcp server: 1::vim /etc/sysconfig/network-scripts/ifcfg-scfg:配置 server的 static IP: 2:vim /etc/dhcpd ...
- redis相关目录
redis的docker化安装 redis的主从配置
- sql语句中#{}和${}的区别
#---将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的 ...
- java8lambda表达式初识
一.函数式接口 只有一个 抽象方法 的 接口 叫函数式接口 /** * @auther hhh * @date 2018/12/24 22:20 * @description 函数式接口:只有 一个 ...
- 详解mysql体系结构和存储引擎
概述 之前整理的一些mysql方面内容,适合做备忘,因为我基本不会去记这些概念性的东西,大家做个了解就可以了. 一.定义数据库和实例 1.数据库: 物理操作系统文件或其他形式文件类型的集合. 在MyS ...
- php用GD库给图片添加水印
php用GD库给图片添加文字水印,整个代码比较简单,DEMO如下: <?php /*打开图片*/ //1.配置图片路径 $src = "aeroplane.jpg"; //2 ...
- 使用PSSH批量操作Linux服务器
简介 服务器多了,有一个问题就是如何批量快速操作多台服务器,在网上搜到了PSSH工具,试用了一下发现挺好用,推荐给大家. pssh是一个python编写的可以在多台服务器上执行命令的轻量级管理工具,同 ...
- jmeter更改启动编码设置
项目中碰到这样的问题,在eclipse经过utf-8转码的代码,能正常运行,放到了jmeter里面运行,就是乱码,如下: String s = "乔佳飞"; String ss = ...
- 玩转VIM之将Vim全副武装
玩转VIM之将Vim全副武装 懒癌末期的我貌似很久没有写博客了,已经欠了多少篇在计划中的博客我已然不好意思说了.好了,言归正传,在前三篇介绍了Vim作为代码编辑器之后可能会有人说,要学习那么多指令真的 ...