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

将状态用一张二分图$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. HTML模板标签解析

    HTML基本模板 1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta cha ...

  2. 15-ThreadLocalRandom类剖析

    ThraedLocalRandom类是JDK7在JUC包下新增的随机数生成器,它弥补了Random类在多线程下的缺陷. Random类及其缺陷 下面看一下java.util.Random的使用方法. ...

  3. 题解 CF961G 【Partitions】

    题目传送门 题目大意 给出\(n,k\),以及\(w_{1,2,..,n}\),定义一个集合\(S\)的权值\(W(S)=|S|\sum_{x\in S} w_x\),定义一个划分\(R\)的权值为\ ...

  4. [kuangbin带你飞]专题一 简单搜索 棋盘问题

    题来:链接https://vjudge.net/problem/OpenJ_Bailian-132 J - 棋盘问题 1.题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别. ...

  5. ffmpeg剪视频

    ffmpeg裁剪合并视频   ffmpeg提供简单的命令参数: ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTP ...

  6. 第二次Alpha Scrum Meeting

    本次会议为Alpha阶段第二次Scrum Meeting会议 会议概要 会议时间:2021年4月24日 会议地点:线上会议 会议时长:30min 会议内容简介:本次会议主要由每个人展示自己目前完成的工 ...

  7. elasticsearch地理位置查询

    elasticsearch地理位置查询 一.背景 二.geo数据类型 1.geo_point 2.geo_shape 三.此处对geo_point类型实战 1.背景 2.插入地点数据 1.创建索引 2 ...

  8. python 修饰器(decorator)

    转载:Python之修饰器 - 知乎 (zhihu.com) 什么是修饰器,为什么叫修饰器 修饰器英文是Decorator, 我们假设这样一种场景:古老的代码中有几个很是复杂的函数F1.F2.F3.. ...

  9. MD5函数(公共方法)

    1 #region MD5函数 2 /// <summary> 3 /// MD5函数 4 /// </summary> 5 /// <param name=" ...

  10. 链表中倒数第K个结点 牛客网 剑指Offer

    链表中倒数第K个结点 牛客网 剑指Offer 题目描述 输入一个链表,输出该链表中倒数第k个结点. # class ListNode: # def __init__(self, x): # self. ...