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

将状态用一张二分图$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. mysql 建表后 重新构建 自增字段 (保留 原有字段结构)

    添加字段 1.去除原id的自增功能:ALTER TABLE A_A MODIFY COLUMN id int(10) NOT NULL FIRST ; 2.添加名称为cstId,类型为bigint的字 ...

  2. IDEA Web渲染插件开发(一)— 使用JCEF

    目前网上已经有了很多关于IDEA(IntelliJ平台)的插件开发教程了,本人觉得简书上这位作者秋水畏寒的关于插件开发的文章很不错,在我进行插件开发的过程中指导了我很多.但是综合下来看,在IDEA上加 ...

  3. Knativa 基于流量的灰度发布和自动弹性实践

    作者 | 李鹏(元毅) 来源 | Serverless 公众号 一.Knative Knative 提供了基于流量的自动扩缩容能力,可以根据应用的请求量,在高峰时自动扩容实例数:当请求量减少以后,自动 ...

  4. CVE-2017-11882 漏洞分析总结 新手漏洞分析详细教程

    CVE-2017-11882分析总结 注: 这篇随笔记录了CVE-2017-11882漏洞分析的整个过程,并介绍了相关调试软件的使用 漏洞信息 CVE-2017-11882属于缓冲区溢出类型漏洞,产生 ...

  5. 攻防世界XCTF-WEB入门全通关

    为了更好的体验,请见我的---->个人博客 XCTF的web块入门区非常简单,适合一些刚接触安全或者对网络安全常识比较了解的同学在安全搞累之余娱乐娱乐. 其主要考察下面几点: 基本的PHP.Py ...

  6. vue3双向数据绑定原理_demo

    <!DOCTYPE html> <head> <meta charset="UTF-8" /> <meta name="view ...

  7. 软工博客之关于CSDN的移动端软件测评

    关于CSDN的移动端软件测评 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件测评作业 我在这个课程的目标 不求变强,只求做好,成为一颗有用的 ...

  8. 疯狂Java基础Day2

    巩固Java流程控制的学习... 一.用户交互Scanner 通过Scanner类获取用户的输入 import java.util.Scanner; public class Demo1 { publ ...

  9. 大型DELETE(删除大量数据)的一种解决方案

    通过执行单条DELETE语句来删除一个大型的数据集会有以下的缺点: 1.DELETE语句的操作要被完整地记录到日志中,这要求在事务日志中要有足够的空间以完成整个事务: 2.在删除操作期间(可能会花费很 ...

  10. P2598 [ZJOI2009]狼和羊的故事(最小割)

    P2598 [ZJOI2009]狼和羊的故事 说真的,要多练练网络流的题了,这么简单的网络流就看不出来... 题目要求我们要求将狼和羊分开,也就是最小割,(等等什么逻辑...头大....) 我们这样想 ...