POJ2466 棋盘覆盖
一张\(n*m\)的棋盘,有\(k\)个点不能被覆盖,问其余点能不能被\(1*2\)的小矩形完全覆盖,多测
这题先输入\(m\)是什么鬼啊!!!
其实是一个比较裸的二分图判定,把\(k\)个点挖去然后将剩余棋盘黑白染色,求二分图最大匹配数,若最大匹配数\(+k==n*m\)输出\(YES\)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
namespace red{
#define int long long
#define mid ((l+r)>>1)
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
typedef pair<int,int> p;
const int N=50;
int n,m,k,ret;
int g[N][N];
p f[N][N];
bool vis[N][N];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
inline void dfs(int x,int y,int col)
{
g[x][y]=col;
for(int i=0;i<4;++i)
{
int tx=x+dx[i],ty=y+dy[i];
if(tx<1||tx>n||ty<1||ty>m) continue;
if(!g[tx][ty]) dfs(tx,ty,col^1);
}
}
inline bool find(int x,int y)
{
for(int i=0;i<4;++i)
{
int tx=x+dx[i],ty=y+dy[i];
if(g[tx][ty]==(g[x][y]^1))
{
if(!vis[tx][ty])
{
vis[tx][ty]=1;
if((f[tx][ty].first==0&&f[tx][ty].second==0)||find(f[tx][ty].first,f[tx][ty].second))
{
f[tx][ty]=p(x,y);
return 1;
}
}
}
}
return 0;
}
inline void main()
{
while(scanf("%lld%lld%lld",&m,&n,&k)==3)
{
memset(g,0,sizeof(g));
memset(f,0,sizeof(f));
ret=0;
for(int x,y,i=1;i<=k;++i)
{
x=read(),y=read();
g[x][y]=99;
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(!g[i][j]) dfs(i,j,2);
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(g[i][j]==2)
{
memset(vis,0,sizeof(vis));
if(find(i,j)) ++ret;
}
}
}
puts(ret*2+k==n*m?"YES":"NO");
}
}
}
signed main()
{
red::main();
return 0;
}
POJ2466 棋盘覆盖的更多相关文章
- 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种不 ...
- CODEVS 2171 棋盘覆盖
2171 棋盘覆盖 给出一张nn(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少12的多米诺骨牌进行掩盖. 错误日志: 直接在模板上调整 \(maxn\) 时没有在相应邻接表数 ...
- 递归与分治策略之棋盘覆盖Java实现
递归与分治策略之棋盘覆盖 一.问题描述 二.过程详解 1.棋盘如下图,其中有一特殊方格:16*16 . 2.第一个分割结果:8*8 3.第二次分割结果:4*4 4.第三次分割结果:2*2 5.第四次分 ...
- JavaScript编写棋盘覆盖
一.前言 之前做了一个算法作业,叫做棋盘覆盖,本来需要用c语言来编写的,但是因为我的c语言是半桶水(哈哈),所以索性就把网上的c语言写法改成JavaScript写法,并且把它的覆盖效果显示出来 二.关 ...
随机推荐
- 磁盘构造/msdos分区(fdisk)格式化(mkfs)和挂载
分区不是必要的,分区是与系统盘分开,防止数据丢失. 磁盘使用流程:查看磁盘(fdisk -l)---分区---格式化(创建文件系统)----挂载(自动挂载) 分区表类型:msdos(一般是系统分区) ...
- 已安装的nginx添加其他模块
总体操作就是添加新模块并重新编译源码,然后把编译后的nginx可执行文件覆盖原来的那个即可.1 查看已安装的参数nginx -V拷贝那些巴拉巴拉的参数,后面编译的时候使用 2 下载相同版本号的源码,解 ...
- TA-Lib技术指标分析
import talib as tb from talib import * print(tb.get_functions()) print(tb.get_function_groups()) 指标大 ...
- Guitar Pro小课堂——如何进行消音
在我们弹吉他时,消音技术是必须掌握的一项吉他技能.在我们遇到休止符时.乐曲结束时.乐段,乐句中止时.吉他旋律的分句,呼吸处:变换和弦时的低音(尤其是空弦低音).断奏.弹奏强音时其他空弦被激起的共鸣音( ...
- 详解pdfFactory的页面管理功能
当我们将文档载入到pdfFactory 之后才发现文档中存在着一些乱页现象.那么是否需要重新整理文档后,再重新载入到软件中呢?实际上,不需要. pdfFactory专业版提供了高效的页面管理功能,用户 ...
- U盘数据丢失怎么办,还能恢复吗
有时候在用U盘的时候会出现数据丢失或者U盘无法打开的问题,检查过之后,发现U盘格式变成了RAW,这是怎么回事?遇到这种情况该怎么解决呢? 首先来看看造成u盘格式变为RAW的主要原因: 1.非正常退出u ...
- Java中的位掩码BitMask
目录 JDK源码的使用 日常工作中的使用 JDK源码的使用 最近在JDK源码中闲逛,无意中看到了java.lang.reflect.Modifier这个类,这个类很简单,都是些常量定义和判断方法,于是 ...
- Java基础知识面试题(最详细版)
刚刚经历过秋招,看了大量的面经,顺便将常见的Java常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗星表示被问到的频率 ...
- Win搭建JAVA环境
一:下载JDK 下载链接:https://www.oracle.com/java/technologies/javase-downloads.html 选择你的系统环境进行下载 二:安装JDK 直接运 ...
- P6823 「EZEC-4」zrmpaul Loves Array
发现进行一次排序后先前的操作都无效了,所以只需做最后一次排序后的操作.翻转操作打个翻转标记,互换操作根据翻转标记即可. 时间复杂度 \(O\left(n+m\right)\). code: #incl ...