【BZOJ2437】【codevs1949】兔兔与蛋蛋游戏,博弈+二分图匹配
传送门1
传送门2
思路:
关于证明
算是bzoj1443的强化版吧
但我是先写的这道题再写的bzoj1443,所以刚开始比较懵逼
二分图中的点是空格、与空格坐标和的奇偶相同的黑点、坐标和奇偶不同的白点
还有一点要注意的是每次删点后是不用再还原回去的,因为被移动的黑点(白点)已经符合二分图中点的条件了
如果蛋蛋走前时先手必胜且上一次兔兔走前时先手必胜,答案加1(s)
代码:
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,k,s,t,cnt,tot;
int a[43][43],first[1605],id[43][43],belong[1605],ans[1005];
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
bool vis[1605],del[1605],ok[1005];
struct edge{int v,next;
}e[10000];
int in()
{char c=getchar();while (c!='O'&&c!='X'&&c!='.') c=getchar();if (c=='O') return 1;if (c=='X') return -1;return 0;
}
void add(int u,int v){e[++tot]=(edge){v,first[u]};first[u]=tot;}
int find(int x)
{if (del[x]) return 0;for (int i=first[x];i;i=e[i].next)if (!vis[e[i].v]&&!del[e[i].v]){vis[e[i].v]=1;if (!belong[e[i].v]||find(belong[e[i].v])){belong[e[i].v]=x,belong[x]=e[i].v;return 1;}}return 0;
}
main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;++i)for (int j=1;j<=m;++j){a[i][j]=in();if (!a[i][j]) s=i,t=j;}for (int i=1;i<=n;++i)for (int j=1;j<=m;++j)if (((i+j&1)!=(s+t&1)&&a[i][j]>0)||((i+j&1)==(s+t&1)&&a[i][j]<=0))id[i][j]=++cnt;for (int i=1;i<=n;++i)for (int j=1;j<=m;++j)if (id[i][j]){for (int k=0;k<4;++k)if (id[i+dx[k]][j+dy[k]])add(id[i][j],id[i+dx[k]][j+dy[k]]);}for (int i=1;i<=cnt;++i)if (!belong[i])memset(vis,0,sizeof(vis)),find(i);scanf("%d",&k);int nx,ny;for (int i=1;i<=k<<1;++i){del[id[s][t]]=1;if (belong[id[s][t]]){belong[belong[id[s][t]]]=0;memset(vis,0,sizeof(vis));ok[i]=!find(belong[id[s][t]]);if (!(i&1)&&ok[i]&&ok[i-1])ans[++ans[0]]=i>>1;}scanf("%d%d",&s,&t);}printf("%d\n",ans[0]);for (int i=1;i<=ans[0];++i) printf("%d\n",ans[i]);
}
【BZOJ2437】【codevs1949】兔兔与蛋蛋游戏,博弈+二分图匹配相关推荐
- BZOJ2437 [Noi2011]兔兔与蛋蛋 【博弈论 + 二分图匹配】
题目链接 BZOJ2437 题解 和JSOI2014很像 只不过这题动态删点 如果我们把空位置看做\(X\)的话,就会发现我们走的路径是一个\(OX\)交错的路径 然后将图二分染色,当前点必胜,当且仅 ...
- P4055 [JSOI2009]游戏(二分图匹配+博弈)
P4055 [JSOI2009]游戏 对于一个网格,上面有一些障碍物不能走,A选择起点,然后B走到相邻的四个格子之一,然后轮流移动不能移动的一方失败.求解所有可以赢的初始位置. 首先对于这个问题要想到 ...
- 【BZOJ1443】游戏Game,博弈+二分图匹配
传送门 思路: 很巧妙的思路 将二分图的匹配与博弈相联系 给出定理: 若二分图中去掉起点后仍存在最大匹配(与先前的最大匹配数相等),那么先手必输:反之先手必胜 关于证明,我昨天晚上和今天中午想了很久, ...
- 【BZOJ - 1059】矩阵游戏(二分图匹配,建图,最小边覆盖)
题干: 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个N *N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换 ...
- [ZJOI2007]矩阵游戏(二分图匹配、匈牙利算法)
小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个N *N黑白方阵进行(如同国际象棋一般,只是颜色是随意的). 每次可以对该矩阵进行两种操作: 行交换操作 ...
- [NOI2011] 兔兔与蛋蛋游戏题解
题目描述 这些天,兔兔和蛋蛋喜欢上了一种新的棋类游戏. 这个游戏是在一个 nn 行 mm 列的棋盘上进行的.游戏开始之前,棋盘上有一个格子是空的,其它的格子中都放置了一枚棋子,棋子或者是黑色,或者是白 ...
- 【题解】P1971 [NOI2011] 兔兔与蛋蛋游戏
首先可以推出来一个引理:空格不可能在经过几次操作后回到原来的位置. 大概感性证明一下:容易发现这个空格如果想要走成一个环,向上走的次数=向下走的次数,向左走的次数=向右走的次数.那么如果开始是兔兔走的 ...
- 2023年玩兔年小游戏《兔兔保卫萝卜战》赢新年祝福「钱兔无量」
PS:粉丝可以免费领源码,私信我或者评论666即可~~~~~~~~ 导读 | 世界杯虽已闭幕,但其带给我们的精彩,仿佛就在昨天,想一想,还是有一种爽劲,不知道大家是否也这样?转眼就到了2023年,今年 ...
- linux 性能测试 antutu,除了安兔兔跑分,还有这6种办法能证明手机强弱
原标题:除了安兔兔跑分,还有这6种办法能证明手机强弱 现在说起手机跑分,已经稀松平常,但早在五年前,很多手机用户根本不知道如何测试手机性能."跑分"这个词汇只会出现在媒体的评测文章 ...
最新文章
- Codeforces 919 D Substring
- Struts2学习总结一
- 线性表的顺序存储结构(数据结构篇)
- 假如王撕葱是程序员。。。
- c语言for循环可以初始化多个变量么_C8循环
- VC制作 Windows服务 安装包
- matlab误差分析报告,误差分析实验报告
- PointCNN程序简介
- 为什么说甲骨文裁员也属无奈之举?
- ios设备的弹窗页面,光标错位,光标乱跳
- RabbitMQ 使用的AMQP模型解析
- Linux操作系统学习笔记【入门必备】
- 医疗APP有哪些功能
- 【数学建模】经典简单例题实例1
- hibernate之SessionFactory和Session
- 附录002《 Git 中的重要概念》
- 全球及中国散热产业产销规模及投资盈利预测报告2021版
- 备战数学建模9-层次分析法模型
- 初学css能做的实战 登录页面制作
- 如何用命令关闭/启动mysql服务
热门文章
- 【华为云技术分享】Linux内核发展史 (3)
- 设计模式的C语言应用-访问者模式-第九章
- 使用CSE轻松实现接口访问控制
- android studio moudel,Android Studio将module变为library
- Spark之StructuredStreaming
- 红橙Darren视频笔记 手写ButterKnife(Android Studio4.2.2 gradle-6.7.1 )
- 查看mysql是否归档的命令_查看oracle数据库是否为归档模式
- 查看在Ubuntu上打印的大型JSON文件
- ubuntu安装常用软件(比如python、搜狗拼音、cudnn等)
- ant java 外部jar包_java – 在使用Ant的新jar文件构建中包括外部jar文件