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

AcWing 372. 棋盘覆盖

时间:2023-02-19 19:57:06浏览次数:37  
标签:cas 372 const vis int long include 棋盘 AcWing

给n*n的方格图铺满1*2 的长条,且某些位置不能铺,问最多能放多少个长条

 

#include <iostream>
#include<queue> 
#include <vector>
#include <cstring>
using namespace std;
 const int N =110 ,M=N*N;
 #define int long long
 vector<int> g[M];
 
 void add_(int x,int y){
 	g[x].push_back(y);
 }
 int n,vis[M],mch[M];
 
 bool dfs(const int x,const int cas){
 	if(vis[x]==cas) return 0; 
 	vis[x]=cas;
 	for(int i=0;i<g[x].size();i++){
 		int y=g[x][i];
 		if(mch[y]==0||dfs(mch[y],cas)){
 			mch[y]=x; return 1;
 		}
 	}
 	return 0;
 }
 
 int K,ban[N][N],b[N][N],id[N][N];
 int D[5][2]={{1,0},{-1,0},{0,1},{0,-1}};
 
 bool OK(int x,int y){
 	return x>0&&x<=n&&y>0&&y<=n;
 }
 signed main(){
 	int i,j,x,y;
 	cin>>n>>K;
 	for(i=1;i<=K;i++){
 		cin>>x>>y;
 		ban[x][y]=1;
 	}
 	for(i=1;i<=n;i++)
 	 for(j=1;j<=n;j++){
 	 	if(ban[i][j]) continue; 
 	 	
 	 	if((i+j)&1) b[i][j]=1; else b[i][j]=0;
 	 	id[i][j]=(i-1)*n+j;
 	 	
 	 	for(int k=0;k<4;k++){
 	 		int xx=D[k][0]+i,yy=D[k][1]+j; 
 	 		 if(OK(xx,yy)==0) continue; 
 	 		if(ban[xx][yy]) continue;
 	 		int id2=(xx-1)*n+yy;
 	 		
 	 		if(b[xx][yy]!=b[i][j]) add_(id[i][j],id2);
 	 	}
 	 }
 	 
 	 int ans=0;
 	for(i=1;i<=n;i++) 
 	 for(j=1;j<=n;j++){
 	 	if(b[i][j] &&ban[i][j]==0&& dfs(id[i][j],id[i][j])) ans++;
 	 }
 	
 	cout<<ans<<endl;
 }

 

标签:cas,372,const,vis,int,long,include,棋盘,AcWing
From: https://www.cnblogs.com/towboa/p/17135432.html

相关文章

  • acwing 数组元素的目标和
    原题链接题解代码双指针#include"iostream"usingnamespacestd;constintN=100010;inta[N],b[N];intmain(){intn,m,x;cin>>n>>m>>x;for(i......
  • acwing 判断子序列
    原题链接题解分析使用双指针,o为数组1的指针,p为数组2的指针因为数组2要比数组1大,所以使p每次循环自增,当有相同值,使o自增,最后检查o是否已经遍历完毕即可代码#includ......
  • ACwing 区间最大公约数题解 线段树(附证明)
    算进区间最大公因数单点线段树 https://www.acwing.com/problem/content/247/题目:给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:Clrd,表......
  • AcWing95. 费解的开关(/思维题)
    原题原题解题目约束题解#include<iostream>#include<cstring>usingnamespacestd;constintN=11;charg[N][N];intdx[]={0,-1,0,1,0},dy[]={0......
  • AcWing788.逆序对的数量(Java)
    题目来源:https://www.acwing.com/problem/content/790/题目描述给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第i个和第j......
  • AcWing 每日一题 未初始化警告
    #include<bits/stdc++.h>usingnamespacestd;signedmain(){intn,k,cnt=0;cin>>n>>k;set<int>se;se.insert(0);while(k--){in......
  • AcWing 787.归并排序(Java)
    题目来源:https://www.acwing.com/problem/content/description/789/题目描述给定你一个长度为n的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将......
  • Acwing -101 最高的牛(差分)
    有 NN 头牛站成一行,被编队为1、2、3…N,每头牛的身高都为整数。当且仅当两头牛中间的牛身高都比它们矮时,两头牛方可看到对方。现在,我们只知道其中最高的牛是第 P 头,它的......
  • 棋盘问题
     在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放......
  • AcWing 785.快速排序(Java)
    题目描述给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数n。第......