TYVJ 1035 / codevs 2171 棋盘覆盖
Problem Description
给定一个n * m的棋盘,已知某些各自禁止放置,求最多往棋盘上放多少长度为2宽度为1的骨牌(骨牌不重叠)
Input
第一行为n,m(表示有m个删除的格子)
第二行到m+1行为x,y,分别表示删除格子所在的位置
x为第x行
y为第y列
output
一个数,即最大覆盖格数
思路:对于棋盘覆盖问题,就是把棋盘拆成各个点然后根据题意把能被一张骨牌覆盖的点连边……然后就可以发现每个横纵坐标之和为奇数的点为左部节点,和为偶数的为右部节点,然后跑最大匹配就可以了
也就是把棋盘两两不相邻地进行黑白染色 然后黑色为左部节点,白色为右部节点,依据题意连边
类似的套路题还有网络流24题中的方格取数问题和骑士共存问题,建模时都是先黑白染色然后连边……
#include<bits/stdc++.h>
using namespace std;
const int N = ;
int g[N], col[N];
int n,m,mat[N];
bool vis[N],er[][]; int head[N],now;
struct edges{
int to,next;
}edge[N<<];
void add(int u,int v){ edge[++now] = {v,head[u]}; head[u] = now;} int id(int x,int y){
return (x - ) * n + y;
} bool dfs(int x){
for(int i = head[x]; i; i = edge[i].next){
int v = edge[i].to;
if(!vis[v]){
vis[v] = ;
if(!mat[v] || dfs(mat[v])){
mat[v] = x;
return ;
}
}
}
return ;
} int main(){
scanf("%d%d",&n,&m);
int a,b;
for(int i = ; i <= m; i++){
scanf("%d%d",&a,&b);
er[a][b] = ;
}
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++){
if(er[i][j] || (i+j) % == ) continue;
if(j > && !er[i][j-]) add(id(i,j), id(i,j-));
if(i > && !er[i-][j]) add(id(i,j), id(i-,j));
if(j < n && !er[i][j+]) add(id(i,j), id(i,j+));
if(i < n && !er[i+][j]) add(id(i,j), id(i+,j));
}
int ans = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++){
memset(vis,,sizeof(vis));
if(dfs(id(i,j)))
ans++;
}
// cout<<now<<endl;
printf("%d\n",ans);
return ;
}
TYVJ 1035 / codevs 2171 棋盘覆盖的更多相关文章
- CODEVS 2171 棋盘覆盖
2171 棋盘覆盖 给出一张nn(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少12的多米诺骨牌进行掩盖. 错误日志: 直接在模板上调整 \(maxn\) 时没有在相应邻接表数 ...
- bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link
2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 255 Solved: 77[Submit][Status] ...
- NYOJ 45 棋盘覆盖
棋盘覆盖 水题,题不难,找公式难 import java.math.BigInteger; import java.util.Scanner; public class Main { public s ...
- 棋盘覆盖(大数阶乘,大数相除 + java)
棋盘覆盖 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...
- NYOJ 45 棋盘覆盖 模拟+高精度
题意就不说了,中文题... 小白上讲了棋盘覆盖,于是我就挖了这题来做. 棋盘覆盖的推导不是很难理解,就是分治的思想,具体可以去谷歌下. 公式就是f(k) = f(k - 1) * 4 + 1,再化解下 ...
- 棋盘覆盖(一) ACM
棋盘覆盖 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的2×2方格(图2为其中缺右下角的一个),去覆盖2k×2k未被覆盖过的方格,求 ...
- 棋盘覆盖问题(算法分析)(Java版)
1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...
- 递归与分治策略之棋盘覆盖Java实现
递归与分治策略之棋盘覆盖 一.问题描述 二.过程详解 1.棋盘如下图,其中有一特殊方格:16*16 . 2.第一个分割结果:8*8 3.第二次分割结果:4*4 4.第三次分割结果:2*2 5.第四次分 ...
- JavaScript编写棋盘覆盖
一.前言 之前做了一个算法作业,叫做棋盘覆盖,本来需要用c语言来编写的,但是因为我的c语言是半桶水(哈哈),所以索性就把网上的c语言写法改成JavaScript写法,并且把它的覆盖效果显示出来 二.关 ...
随机推荐
- PHP一些常用魔术方法
魔术方法 调用方法 作用__set 有两个 ...
- YII2 多MongoDB配置和使用
1:在config/web.php 文件下配置多个连接即可: 注意在componets 下 'mongodb' => [ 'class' => '\yii\mongodb\Connecti ...
- pynlpir + pandas 文本分析
pynlpir是中科院发布的一个分词系统,pandas(Python Data Analysis Library) 是python中一个常用的用来进行数据分析和统计的库,利用这两个库能够对中文文本数据 ...
- Java学习笔记七:Java的流程控制语句之switch
Java条件语句之 switch 当需要对选项进行等值判断时,使用 switch 语句更加简洁明了.例如:根据考试分数,给予前四名不同的奖品.第一名,奖励笔记本一台:第二名,奖励 IPAD 2 一个: ...
- 分享一个工作中遇得到的sql(按每天每人统计拖车次数与小修次数)
查询每人每天的数据 首先先建表 CREATE TABLE `user` ( `name` ) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CR ...
- Python3 time模块&datetime模块&random模块
''' time模块 ''' # import time # print(help(time)) # help()提供帮助 # print(time.time()) # 1970年开始到现在的秒数(时 ...
- python2.7练习小例子(十三)
13):题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成.(1)如果这个质数恰等于 ...
- P1016 旅行家的预算
P1016 旅行家的预算 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2 ...
- LeetCode:5. Longest Palindromic Substring(Medium)
原题链接:https://leetcode.com/problems/longest-palindromic-substring/description/ 1. 题目要求:找出字符串中的最大回文子串 ...
- javascript对象转为字符串
function getStringTime(time){ //年 year = time.getFullYear(); //月 month = time.getMonth() if(String(m ...