首页 > 其他分享 >「TYVJ1035」棋盘覆盖 解题报告

「TYVJ1035」棋盘覆盖 解题报告

时间:2022-09-02 20:00:27浏览次数:50  
标签:多米诺骨牌 覆盖 格子 int 解题 return 棋盘 TYVJ1035

「TYVJ1035」棋盘覆盖

题目描述

给出一张 \(n\) (\(n< =100\))的国际象棋棋盘,其中被删除了一些点,问可以使用多少\(1*2\)的多米诺骨牌进行掩盖。

输入

第一行为\(n\),\(m\)(表示有\(m\)个删除的格子) 第二行到\(m+1\)行为\(x,y\),分别表示删除格子所在的位置 \(x\)为第\(x\)行 \(y\)为第\(y\)列

输出

一个数,即最大覆盖格数

solution

我们可以显然地发现每张多米诺骨牌是覆盖了一个黑色格子和一个白色格子的

然后由于每个格子只能由一张多米诺骨牌覆盖(也就是不能重叠)

所以每个黑色格子只能和一个白色格子同在一张多米诺骨牌下

因此,我们可以将这个问题转换为二分图模型:

左部点=黑点(横纵坐标之和为偶数)

右部点=白点(横纵坐标之和为奇数)

边=多米诺骨牌

即我们将每两个合法的格子连边,表示我们可以在这两个格子上放一张骨牌

合法:其中任意一个格子未被删除且这两个格子相邻

每个点最多只能连一条边

因此我们跑二分图最大匹配即可

code

#include<bits/stdc++.h>
using namespace std;
const int N=1e2+2,M=1e4+2;
vector<int>G[M];
int lx[]={0,0,1,-1},ly[]={1,-1,0,0};//方向数组
int ans,f[N][N],vis[M],x,y,n,m,match[M];//f记录被禁的点,vis用于枚举各左部点时标记
void add(int x,int y){
	G[x].push_back(y);
}
int dfs(int x){//匈牙利算法板子
	for(int i=0;i<G[x].size();i++){
		int y=G[x][i];
		if(vis[y]) continue;
		vis[y]=1;
		if(match[y]==-1||dfs(match[y])){
			match[y]=x;
			return 1;
		}
	}
	return 0;
}
bool check(int x,int y){
	if(x<=0||x>n||y<=0||y>n) return 0;
	if(f[x][y]) return 0;
	if(!((x+y)&1)) return 0;
	return 1;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		f[x][y]=1;//记录被禁放的点
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(f[i][j]) continue;
			for(int k=0;k<4;k++){//四个方向上相邻的点
				int x=i+lx[k],y=j+ly[k];//为了方便处理将二维转成一维,重新编号
				if(!check(x,y)) continue;//判断是否合法 
				add((i-1)*n+j,(x-1)*n+y); //加边
			} 
		}
	}
	memset(match,-1,sizeof(match));
	for(int i=1;i<=n*n;i++){//因为每个点都按一维处理,因此从1扫到n*n
		memset(vis,0,sizeof(vis));//每次找都要清空一次标记数组
		if(dfs(i))ans++;//如果左右匹配成功边数+1
	}
	printf("%d",ans);
	return 0;
}

完结撒花❀

★,°:.☆( ̄▽ ̄)/$:.°★

标签:多米诺骨牌,覆盖,格子,int,解题,return,棋盘,TYVJ1035
From: https://www.cnblogs.com/Aurora1217/p/16651072.html

相关文章

  • [BZOJ4919]大根堆 解题报告
    [BZOJ4919]大根堆Description给定一棵\(n\)个节点的有根树,编号依次为\(1\)到\(n\),其中\(1\)号点为根节点。每个点有一个权值\(v_i\)。你需要将这棵树转化成一个大根堆。......
  • luoguP4824 [USACO15FEB] Censoring S 解题报告
    血的教训。。。传送门题意FJ已经根据杂志的所有文字,创建了一个字符串$S$($S$的长度保证不超过$10^6$),他想删除其中的子串$T$,他将删去$S$......
  • [JOI 2015 Final]舞会 解题报告
    [JOI2015Final]舞会题目描述IOI王国为了庆祝JOI公主的生日,举行了舞会。预定有 N 位贵族要参加舞会。 N 是奇数。将贵族们从 \(1\) 到 \(N\) 编号。每个贵......
  • CF739C Alyona and towers 解题报告
    线段树绝世好题。题意:维护区间加,全局最长单峰序列。Solution:维护\(8\)个量。\(lval\):左端点的权值。\(rval\):右端点的权值。\(lmax\):以左端点开始的最长的下降序......
  • 2022 杭电多校解题报告 第一场
    B.Dragonslayer(二进制枚举+bfs)题意:给定一个n*m的网格,视格子中间为点,格线为墙,指定x堵墙(x<=15),穿过一堵墙耗费一体力,问从起点到终点的最小体力为多少分析:注意到......
  • 2022牛客暑期多校集训解题报告 第一场
    A.Villages:Landlines题意:给定n-1个建筑和一个发电站,分布在一个一维的数轴上,这n-1个建筑都有各自的电力接受范围,不连通的建筑可以通过电相连,问使每个建筑都通上电......
  • 题解:【WC2005】双面棋盘
    【WC2005】双面棋盘题目链接这天做双面棋盘这道题,发现题解里面大多都是LCT,对于线段树套并查集的写法思路讲评很少而且不大清晰,因此有了这一篇题解。维护联通块的数量,......
  • WireShark 学习及CTF MISC解题
    序号  题目名称  考点  题目URL1  流量分析2  HTTP状态码206  https://adworld.xctf.org.cn/challenges/details?hash=5f9a4d36-13c6-11ed-9827......
  • LeetCode/变为棋盘
    一个 nxn 的二维网络 board 仅由 0 和 1 组成 。每次移动,你能任意交换两列或是两行的位置返回将这个矩阵变为 “棋盘”  所需的最小移动次数 ,如果不存在......
  • 「PKUSC2021」Sum Transformation 解题报告
    题目描述定义矩阵变换 \(F(P)=Q\),其中 \(P\) 和 \(Q\) 是\(n×n\) 的矩阵且满足 \(Q_{i,j}=(\sum^{n}_{k=1}P_{k,j}+\sum_{k=1}^nP_{i,k})mod\spacep\)。给定 \(......