将棋盘黑白染色,即构成一张二分图

将状态用一张二分图$G$和一个点$x\in V$描述(分别为仍未被经过的点的导出子图和当前棋子所在位置),并称将要移动棋子的一方为先手

结论:先手必胜当且仅当$x$一定在$G$的最大匹配中

对该结论归纳,显然$|V|\le 2$时显然成立

若$|V|<n$时成立,考虑$|V|=n$时——

若$x$一定在最大匹配中,先手任选一组最大匹配并将棋子移动到匹配的点

注意到将新图(指删去$x$后)的最大匹配数恰比原图少1(否则即存在最大匹配不包含$x$),因此先手所选的最大匹配去掉$x$所在的匹配后也为新图的最大匹配

其并不包含棋子所在的点,根据归纳假设即先手必胜

若$x$不一定在最大匹配中,那么新图的最大匹配数和原图相同

注意到如果新图的最大匹配不包含某个与$x$相邻的点,那么原图的最大匹配就可以在此基础上增加$x$和该点的匹配,即与两者最大匹配数相同矛盾

因此,所有与$x$相邻的点都一定在新图的最大匹配中,根据归纳假设即先手必败

综上,即得证

由此,对其先任求一组最大匹配,不在匹配中的点即一定在答案中,对匹配中的点再对其所匹配的寻找增广路来判断是否一定在最大匹配中

时间复杂度为$o(n^{2}m^{2})$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 struct Edge{
5 int nex,to;
6 }edge[N*N*4];
7 int n,m,V,E,tot,id[N][N],head[N*N],vis[N*N],match[N*N],ans[N*N];
8 char s[N][N];
9 void add(int x,int y){
10 edge[E].nex=head[x];
11 edge[E].to=y;
12 head[x]=E++;
13 }
14 bool dfs(int k){
15 if (vis[k])return 0;
16 vis[k]=1;
17 for(int i=head[k];i!=-1;i=edge[i].nex)
18 if ((!match[edge[i].to])||(dfs(match[edge[i].to]))){
19 match[k]=edge[i].to;
20 match[edge[i].to]=k;
21 return 1;
22 }
23 return 0;
24 }
25 int main(){
26 scanf("%d%d",&n,&m);
27 for(int i=0;i<n;i++){
28 scanf("%s",s[i]);
29 for(int j=0;j<m;j++)
30 if (s[i][j]!='#')id[i][j]=++V;
31 }
32 memset(head,-1,sizeof(head));
33 for(int i=0;i<n;i++)
34 for(int j=0;j<m;j++)
35 if (id[i][j]){
36 if ((i)&&(id[i-1][j])){
37 add(id[i][j],id[i-1][j]);
38 add(id[i-1][j],id[i][j]);
39 }
40 if ((j)&&(id[i][j-1])){
41 add(id[i][j],id[i][j-1]);
42 add(id[i][j-1],id[i][j]);
43 }
44 }
45 for(int i=1;i<=V;i++)
46 if (!match[i]){
47 memset(vis,0,sizeof(vis));
48 dfs(i);
49 }
50 for(int i=1;i<=V;i++)
51 if (!match[i])ans[i]=1;
52 else{
53 memset(vis,0,sizeof(vis));
54 ans[i]=dfs(match[i]);
55 if (ans[i])match[i]=0;
56 }
57 for(int i=0;i<n;i++)
58 for(int j=0;j<m;j++)
59 if ((id[i][j])&&(ans[id[i][j]]))tot++;
60 printf("%d\n",tot);
61 for(int i=0;i<n;i++)
62 for(int j=0;j<m;j++)
63 if ((id[i][j])&&(ans[id[i][j]]))printf("%d %d\n",i+1,j+1);
64 }

[loj6033]棋盘游戏的更多相关文章

  1. [LOJ6029~6052]雅礼集训 2017 选做

    Link 代码可以在loj上看我的提交记录. Day 1 [LOJ6029]市场 对于一次除法操作,若区间内所有数的减少量均相同则可视作区间减法,否则暴力递归下去.显然一个线段树节点只会被暴力递归进去 ...

  2. LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)

    什么神仙思路啊-- 看到棋盘就去想二分图.(smg啊)(其实是校内模拟赛有基本一样的题,只不过直接给了个二分图) 看到二分图就去想最大匹配.(我怎么想偶环的性质去了) (以下内容摘自这里) 这个二分图 ...

  3. HD1281棋盘游戏(匹配+好题)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. hdu------1281 棋盘游戏(最小覆盖点)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. hdu 1281 棋盘游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  6. 洛谷P1117 棋盘游戏

    洛谷1117 棋盘游戏 题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的.移动棋子的规则是交换相邻两个棋子.现在给出一个初始棋盘和一个最终棋盘,要 ...

  7. UESTC_棋盘游戏 CDOJ 578

    最近昀昀学习到了一种新的棋盘游戏,这是一个在一个N×N的格子棋盘上去搞M个棋子的游戏,游戏的规则有下列几条: 棋盘上有且仅有一个出口 开始时没有哪个棋子在出口,而且所有棋子都不相邻(这里的相邻是指上下 ...

  8. Loj #2731 「JOISC 2016 Day 1」棋盘游戏

    Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...

  9. Hdu1281 棋盘游戏

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

随机推荐

  1. 数据库MHA原理

    一.数据库的高可用MHA (1):详细的步骤 1.master mysql宕机了,MHA manager :无法连接master 2.MHA在S1 S2找一个延迟最小的slave,确定为未来的mast ...

  2. 实时获取股票数据,免费!——Python爬虫Sina Stock实战

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 实时股票数据的重要性 对于四大可交易资产:股票.期货.期权.数字货币来说,期货.期权.数字货币,可以从交 ...

  3. MySQL中如何选择合适的备份策略和备份工具

    ​数据库备份的重要性毋庸置疑,可以说,它是数据安全的最后一道防线.鉴于此,对于备份,我们通常会做以下要求: 多地部署 对于核心数据库,我们通常有两地三中心的部署要求.对于备份来说,也是如此. 一个备份 ...

  4. 创建HTML文档

    目录 创建HTML文档 构筑基本的文档结构 DOCTYPE元素 DOCTYPE元素 代码清单1 使用DOCTYPE元素 html元素 html元素 代码清单2 使用html元素 head元素 head ...

  5. SpringCloud 2020.0.4 系列之Eureka

    1. 概述 老话说的好:遇见困难,首先要做的是积极的想解决办法,而不是先去泄气.抱怨或生气. 言归正传,微服务是当今非常流行的一种架构方式,其中 SpringCloud 是我们常用的一种微服务框架. ...

  6. 【UE4 C++】编程子系统 Subsystem

    概述 定义 Subsystems 是一套可以定义.自动实例化和释放的类的框架.可以将其理解为 GamePlay 级别的 Component 不支持网络赋值 4.22开始引入,4.24完善.(可以移植源 ...

  7. 六步教你如何用PADS进行PCB设计?

    在使用PADS进行PCB设计的过程中,需要对印制板的设计流程以及相关的注意事项进行重点关注,这样才能更好的为工作组中的设计人员提供系统的设计规范,同时也方便设计人员之间进行相互的交流和检查. 02 设 ...

  8. 攻防世界 杂项 12.Training-Stegano-1

    题目描述: 这是我能想到的最基础的图片隐写术.啊这 题目分析: 最初还以为直接右击属性查看呢 然后用notepad++看看,一团乱码,结果在最后发现了passwd, 然后这就是flag:stegano ...

  9. NOIP模拟85(多校18)

    前言 好像每个题目背景所描述的人都是某部番里的角色,热切好像都挺惨的(情感上的惨). 然后我只知道 T1 的莓,确实挺惨... T1 莓良心 解题思路 首先答案只与 \(w\) 的和有关系,于是问题就 ...

  10. SpringCloud微服务实战——搭建企业级开发框架(十三):OpenFeign+Ribbon实现高可用重试机制

      Spring Cloud OpenFeign 默认是使用Ribbon实现负载均衡和重试机制的,虽然Feign有自己的重试机制,但该功能在Spring Cloud OpenFeign基本用不上,除非 ...