bzoj 2437 [Noi2011]兔子和鸡蛋 [二分图匹配]
叙述性说明
这些日子。兔子和蛋像一个新的棋盘游戏。
这场比赛是在 n 行 m 在船上进行列。
前,棋盘上有一
个格子是空的,其他的格子中都放置了一枚棋子,棋子或者是黑色,或者是白色。
每一局游戏总是兔兔先操作。之后两方轮流操作。详细操作为:
兔兔每次操作时,选择一枚与空格相邻的白色棋子,将它移进空格。
蛋蛋每次操作时,选择一枚与空格相邻的黑色棋子,将它移进空格。
第一个不能依照规则操作的人输掉游戏。

近期兔兔总是输掉游戏,并且蛋蛋格外嚣张,于是兔兔想请她的好朋友——
你——来帮助她。
她带来了一局输给蛋蛋的游戏的实录。请你指出这一局游戏中
全部她“犯错误”的地方。
注意:
两个格子相邻当且仅当它们有一条公共边。
兔兔的操作是“犯错误”的。当且仅当。在这次操作前兔兔有必胜策略。
而这次操作后蛋蛋有必胜策略。
格式
输入格式
输入的第一行包括两个正整数 n、m。
接下来 n行描写叙述初始棋盘。当中第i 行包括 m个字符。每一个字符都是大写英
文字母"X"、大写英文字母"O"或点号"."之中的一个。分别表示相应的棋盘格中有黑色
棋子、有白色棋子和没有棋子。
当中点号"."恰好出现一次。
接下来一行包括一个整数 k(1≤k≤1000) ,表示兔兔和蛋蛋各进行了k次操
作。
接下来 2k行描写叙述一局游戏的过程。
当中第 2i – 1行是兔兔的第 i 次操作(编
号为i的操作) ,第2i行是蛋蛋的第i次操作。每一个操作使用两个整数x,y来描写叙述。
表示将第x行第y列中的棋子移进空格中。
输入保证整个棋盘中仅仅有一个格子没有棋子, 游戏过程中兔兔和蛋蛋的每一个
操作都是合法的。且最后蛋蛋获胜。
输出格式
输出文件的第一行包括一个整数r。表示兔兔犯错误的总次数。
接下来r 行按递增的顺序给出兔兔“犯错误”的操作编号。
当中第 i 行包括
一个整数ai表示兔兔第i 个犯错误的操作是他在游戏中的第 ai次操作。
例子1
例子输入1
1 6
XO.OXO
1
1 2
1 1
例子输出1
1
1
例子2
例子输入2
3 3
XOX
O.O
XOX
4
2 3
1 3
1 2
1 1
2 1
3 1
3 2
3 3
例子输出2
0
例子3
例子输入3
4 4
OOXX
OXXO
OO.O
XXXO
2
3 2
2 2
1 2
1 3
例子输出3
2
1
2
提示
1~2: n=1, 1<=m<=20
3: n=3, m=4
4~5: n=4, m=4
6~7: n=4, m=5
8: n=3, m=7
9~14: n=2, 1<=m<=40
15~16: 1<=n<=16, 1<=m<=16
17~20: 1<=n<=40, 1<=m<=40
Solution
能够看做是将空格依照黑白交替的方式移动。
先把格子黑白染色,最好还是令起点为黑色,相邻且颜色不同的格子连边。连边时注意。假设起点坐标为(x,y)。且(x+y)%2=0。则仅仅有相同横纵坐标之和为奇数的黑格子才实用。
假设起点在一定最大匹配中,则一定先手必胜。由于起点一定在奇数边的交错轨中。仅仅要每次都沿着匹配的边走,一定能够赢。
假设起点不一定在最大匹配中,则后手必胜。由于第一步走到的点,一定在不包括起点的最大匹配中。
所以仅仅要当前点一定在最大匹配中就是必胜态,假设走之前是必胜态,走之后还是必胜态。那么说明这一步就走错了。
#include <bits/stdc++.h>
using namespace std;
int n, m;
int arr[45][45];
int tot;
int x, y;
int num[45][45];
vector<int> edges[10005];
bool vis[10005], ban[10005];
int mat[10050];
bool dfs(int i) {
if (ban[i]) return false;
for (int j = 0; j < edges[i].size(); j++) {
int k = edges[i][j];
if (!vis[k] && !ban[k]) {
vis[k] = 1;
if (!mat[k] || dfs(mat[k])) {
mat[k] = i;
mat[i] = k;
return true;
}
}
}
return false;
}
int ans[10005];
int main() {
scanf("%d %d", &n, &m);
char str[45];
for (int i = 1; i <= n; i++) {
scanf("%s", str + 1);
for (int j = 1; j <= m; j++) {
if (str[j] == 'O') arr[i][j] = 1;
else if (str[j] == 'X') arr[i][j] = 2;
else arr[i][j] = 2, x = i, y = j;
}
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (arr[i][j] == 1 ^ (((i + j) & 1) == ((x + y) & 1)))
num[i][j] = ++tot;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (!num[i][j]) continue;
if (num[i + 1][j]) {
edges[num[i][j]].push_back(num[i + 1][j]);
edges[num[i + 1][j]].push_back(num[i][j]);
}
if (num[i][j + 1]) {
edges[num[i][j]].push_back(num[i][j + 1]);
edges[num[i][j + 1]].push_back(num[i][j]);
}
}
}
for (int i = 1; i <= tot; i++) {
memset(vis, 0, sizeof(vis));
if (!mat[i]) dfs(i);
}
int k;
scanf("%d", &k);
for (int i = 1; i <= k << 1; i++) {
int fuck = num[x][y];
ban[fuck] = 1;
if (mat[fuck]) {
int match = mat[fuck];
mat[match] = mat[fuck] = 0;
memset(vis, 0, sizeof(vis));
ans[i] = (!dfs(match));
}
scanf("%d %d", &x, &y);
}
int res = 0;
for (int i = 1; i <= k; i++)
res += (ans[i * 2 - 1] & ans[i * 2]);
printf("%d\n", res);
for (int i = 1; i <= k; i++) {
if (ans[i * 2 - 1] & ans[i * 2]) {
printf("%d\n", i);
}
}
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
bzoj 2437 [Noi2011]兔子和鸡蛋 [二分图匹配]的更多相关文章
- BZOJ 1059 [ZJOI2007]矩阵游戏:二分图匹配
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 题意: 给你一个n*n的01矩阵. 你可以任意次地交换某两行或某两列. 问你是否可以 ...
- BZOJ:[JSOI2009]游戏Game【二分图匹配乱搞】
题目大意:n*m的棋盘,其中有些区域是禁区,两个人在棋盘上进行博弈,后手选择棋子的初始位置,然后先后手轮流将棋子往上下左右移动,走过的区域不能再走,问能否有一个位置使得后手必胜 Input 输入数据首 ...
- bzoj 1191 [ HNOI 2006 ] 超级英雄Hero —— 二分图匹配
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1191 就是二分图匹配的裸题: 注意题目要求是第一次匹配失败就退出!没仔细看题差点丢失1A. ...
- BZOJ 1191: [HNOI2006]超级英雄Hero(二分图匹配)
1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6263 Solved: 2799[Submit][ ...
- bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势
noi2011 兔兔与蛋蛋 题目大意 直接看原题吧 就是\(n*m\)的格子上有一些白棋和一些黑棋和唯一一个空格 兔兔先手,蛋蛋后手 兔兔要把与空格相邻的其中一个白棋移到空格里 蛋蛋要把与空格相邻的其 ...
- BZOJ.2437.[NOI2011]兔兔与蛋蛋游戏(二分图博弈 匈牙利)
题目链接 首先空格的移动等价于棋子在黑白格交替移动(设起点移向白格就是黑色),且不会走到到起点距离为奇数的黑格.到起点距离为偶数的白格(删掉就行了),且不会重复走一个格子. (然后策略就同上题了,只不 ...
- bzoj 2437: [Noi2011]兔兔与蛋蛋
Description Solution 考虑犯错误的条件:之前是处于必胜状态,该操作之后就变成了必败状态. 我们可以把这个过程看成两人对网格图进行黑白染色,变成了一个二分图模型,即当前位置向相邻不同 ...
- BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191 题意: 有m道题,每答对一题才能接着回答下一个问题. 你一道题都不会,但是你有n个“ ...
- BZOJ 1191: [HNOI2006]超级英雄Hero【二分图匹配】
裸的匹配题,一眼就能看出来二分图的模型,是某个经典题的改编.貌似某本图论书上讲过的,有N个人以及M个职位,每个职位只能提供给一个人,而每个人由于能力有限只能胜任有限个职位,问是否有办法使得每个人都有工 ...
随机推荐
- JSP与ASP.PHP的比較
眼下,最经常使用的三种动态网页语言为:ASP(Active Server Pages).PHP(HyperText Preprocessor)及JSP(Java Server Pages). JSP与 ...
- Windows Phone开发(19):三维透视效果
原文:Windows Phone开发(19):三维透视效果 三维效果也可以叫透视效果,所以,我干脆叫三维透视效果.理论知识少讲,直接用例开场吧,因为这个三维效果其实很简单,比上一节中的变换更省事,不信 ...
- kb3035583
dism /online /Get-Packages /Format:Table|findstr 3035583 升级到w10补丁
- WPF中对三维模型的控制
原文:WPF中对三维模型的控制 (以下选自南开大学出版社出版的<WPF和Silverlight教程>) 3Dmax中的建模模型可以导出为obj文件格式,将此文件导入WPF项目中,由WPF完 ...
- Android系统开发(2)——GDB调试工具
调试的过程 我们在eclipse中来看一下一般调试的过程: 1.debug模式编译 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3YW5nYW5iY ...
- java.io.FileNotFoundException: /home/hadoop/hadoop/dfs/namenode/current/VERSION (Permission denied)
今天布置hadoop集群,尝试单独将secondarynamenode分属到一台独立的虚拟机上, 当格式化后,start-dfs.sh.namenode没启动.查看日志.报错例如以下 查看权限才发现, ...
- 当用户登录,经常会有实时的下拉框,例如,输入邮箱,将会@qq.com,@163.com,@sohu.com
如图所示, 码,如以下:<input id="user_sn" class="loginInput" name="user_sn" t ...
- —页面布局实例———win7自己的小算盘
晚上7各地点布局,9点半,刚拿到. 他发现自己专注的时候效率挺高真的哈萨克斯坦.计算器布局前.做了两件简单的页面布局练练手.今晚总体感觉更好,不难. 器之间调试有点蛋疼,真心不想搭理IE. 在进行布局 ...
- 查看.a架构文件
苹果公司现在要求所有新提交的评论app,我们必须支持64位架构.而我们的在线项目编制,操作员做了一堆SDK在需要访问,我们发现,在这个过程中,有些SDK的.a文件进入后,链接错误,如提示 Undefi ...
- 【转】d3d的投影矩阵推导
原帖地址:http://blog.csdn.net/popy007/article/details/4091967 上一篇文章中我们讨论了透视投影变换的原理,分析了OpenGL所使用的透视投影矩阵的生 ...