首页 > 其他分享 >372. 棋盘覆盖

372. 棋盘覆盖

时间:2022-11-29 16:26:13浏览次数:63  
标签:372 覆盖 int nx ny le 棋盘 define

题目链接

372. 棋盘覆盖

给定一个 \(N\) 行 \(N\) 列的棋盘,已知某些格子禁止放置。

求最多能往棋盘上放多少块的长度为 \(2\)、宽度为 \(1\) 的骨牌,骨牌的边界与格线重合(骨牌占用两个格子),并且任意两张骨牌都不重叠。

输入格式

第一行包含两个整数 \(N\) 和 \(t\),其中 \(t\) 为禁止放置的格子的数量。

接下来 \(t\) 行每行包含两个整数 \(x\) 和 \(y\),表示位于第 \(x\) 行第 \(y\) 列的格子禁止放置,行列数从 \(1\) 开始。

输出格式

输出一个整数,表示结果。

数据范围

\(1 \le N \le 100\),
\(0 \le t \le 100\)

输入样例:

8 0

输出样例:

32

解题思路

匈牙利算法

除去障碍物,任意两个连续的方块之间连边,本质上就是要求出点不重复的最多边数,即二分图的最大匹配,用匈牙利算法求解即可

  • 时间复杂度:\(O(n^4)\)

代码

// Problem: 棋盘覆盖
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/374/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// %%%Skyqwq
#include <bits/stdc++.h>
 
//#define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
 
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
 
template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }
 
template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

const int N=105;
int n,t;
bool g[N][N],st[N][N];
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
PII match[N][N];
bool find(int x,int y)
{
	for(int i=0;i<4;i++)
	{
		int nx=x+dx[i],ny=y+dy[i];
		if(nx<1||nx>n||ny<1||ny>n||g[nx][ny])continue;
		if(!st[nx][ny])
		{
			st[nx][ny]=true;
			if(match[nx][ny].fi==0&&match[nx][ny].se==0||find(nx,ny))
			{
				match[nx][ny]={x,y};
				return true;
			}
		}
	}
	return false;
}
int main()
{
    scanf("%d%d",&n,&t);
    for(int i=1;i<=t;i++)
    {
    	int x,y;
    	scanf("%d%d",&x,&y);
    	g[x][y]=true;
    }
    int res=0;
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=n;j++)
    	{
    		if((i+j)%2==0||g[i][j])continue;
    		memset(st,0,sizeof st);
    		if(find(i,j))res++;
    	}
    printf("%d",res);
    return 0;
}

标签:372,覆盖,int,nx,ny,le,棋盘,define
From: https://www.cnblogs.com/zyyun/p/16935682.html

相关文章

  • StringUtils 使用更新对象的非空值去覆盖待更新对象
    //使用更新对象的非空值去覆盖待更新对象StringUtils.copyPropertiesIgnoreNull(device,dev);//用device对象去覆盖dev对象复制属性:将attr实体中的属性一一拷贝给attrE......
  • Go1.20 新版覆盖率方案解读
    玩过Go覆盖率的同学当有所了解,Go的覆盖率方案最初的设计目标仅是针对单测场景,导致其局限性很大。而为了适配更多的场景,行业内各种博客、插件、黑科技介绍也层出不穷。当然,......
  • JaCoCo增量覆盖率的基本实现原理
    什么是增量覆盖率如图所示,在master分支提交了HelloController,然后从master拉了个新分支test;提交了第1次代码,增加了WorldController;提交了第2次代码,增加了DonController。增......
  • <三>关于重载 隐藏 覆盖
    重载关系一组函数要重载,必须处在同一个作用域zhong,而且函数名字相同,参数列表不同代码1中的Base中的show()和show(int)属于重载代码2中的Base中的show()和Deri......
  • [DP 形状 线性]P1990 覆盖墙壁
    [DP形状线性]P1990覆盖墙壁​​题目链接​​思路把边界形状作为状态标识,类似杨老师照相序列那题为长度为i,状态为j的方案数目标是:代码//Problem:P1990覆盖墙壁//Con......
  • LeetCode 76.最小覆盖子串
    LeetCode76.最小覆盖子串题目链接:​​https://leetcode-cn.com/problems/minimum-window-substring/​​题目描述:给你一个字符串 s 、一个字符串 t 。返回 s 中涵......
  • JaCoCo增量覆盖率的基本实现原理
    什么是增量覆盖率如图所示,在master分支提交了HelloController,然后从master拉了个新分支test;提交了第1次代码,增加了WorldController;提交了第2次代码,增加了DonController。......
  • 往数组中push对象,会覆盖之前 push的值
    1varobj={a:123,b:234,c:345};2vararray=[];3for(vari=0;i<obj.length;i++){varresultObj={};resultObj.name=obj[i];array.push(resultObj);4};......
  • 2142. 最小矩形覆盖
    题目链接2142.最小矩形覆盖已知平面上不共线的一组点的坐标,求覆盖这组点的面积最小的矩形。输出矩形的面积和四个顶点的坐标。输入格式第一行包含一个整数\(n\),表示......
  • 3028. 最小圆覆盖
    题目链接3028.最小圆覆盖在一个二维平面上给定\(N\)个点,请你画出一个最小的能够包含所有点的圆。圆的边上的点视作在圆的内部。输入格式第一行包含一个整数\(N\)......