poj 2446 Chessboard

标签: poj 2446 Chessboard
8人阅读 评论(0) 收藏 举报
分类:

题目

求2*1的骨牌是否能覆盖棋盘。


分析

首先,如果抠掉后剩下的块数是奇数,就不会成立。
接着,如果奇数点和偶数点数量不同,也不会成立(留给读者思考)
这里写图片描述
特判结束后,二分图走起。


代码

#include <cstdio>
#include <cctype>
#include <cstring>
using namespace std;
const short dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
short n,m,k,v[33][33],m1,m2,x[551],y[551],cover[551],link[551],ans;
int in(){
    int ans=0; char c=getchar();
    while (!isdigit(c)) c=getchar();
    while (isdigit(c)) ans=ans*10+c-48,c=getchar();
    return ans;
}
bool find(int num){
    int x1=x[num],y1=y[num];
    for (int i=0;i<4;i++){
        int x2=x1+dx[i],y2=y1+dy[i]; int j=v[x2][y2];
        if (x2<1||y2<1||x2>n||y2>m||j==6e2||cover[j]) continue;
        int q=link[j]; link[j]=num; cover[j]=1;
        if (!q||find(q)) return 1; link[j]=q; 
    }
    return 0;
}
int main(){
    m=in(); n=in(); k=in();
    if ((n*m-k)%2) return !printf("NO");
    for (int i=1;i<=k;i++) v[in()][in()]=6e2;
    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    if (v[i][j]!=6e2){
        if ((i+j)%2==0) v[i][j]=++m2;
        else v[i][j]=++m1,x[m1]=i,y[m1]=j;
    }
    for (int i=1;i<=m1;i++)
    memset(cover,0,sizeof(cover)),ans+=find(i);
    if (ans*2==(n*m-k)) return !printf("YES");
    else return !printf("NO");
}
查看评论

poj 2446 Chessboard(二分图最大匹配)

Chessboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16624   Ac...
  • acm_cxq
  • acm_cxq
  • 2016-07-27 09:57:38
  • 211

POJ-2446 Chessboard

题目链接:http://poj.org/problem?id=2446 题目大意: 给你一个m*n的棋盘,其中有k个小洞,现在给你1*2的纸片,如果能恰好覆盖没有洞的全部格子,而且每个格子不能被覆...
  • niushuai666
  • niushuai666
  • 2011-12-01 15:56:22
  • 3080

poj_2446 Chessboard匈牙利算法

思路:
  • yeruby
  • yeruby
  • 2014-09-26 10:36:28
  • 676

POJ2446--Chessboard

Description Alice and Bob often play games on chessboard. One day, Alice draws a board with size ...
  • a305657
  • a305657
  • 2013-08-01 13:34:27
  • 698

POJ 2446 Chessboard(二分图-网格图构图)

http://poj.org/problem?id=2446 这道题,十分的妙啊。我一开始死活想不出到底怎么做,这竟然是二分图???我往这方面想也没有结果。后来在网上看到了二分图常用的建图技巧,我看...
  • llzhh
  • llzhh
  • 2017-05-02 17:43:11
  • 253

POJ2446 Chessboard(二分图)

题意: 一个n*m的棋盘上有t个坑,要求用1*2的纸条完全覆盖这个棋盘,纸条不能盖上坑。 要点: 这题是二分图,就是求二分图的最大匹配,看是否与棋盘格子数-坑数相等。但是具体的集合很难想,看了网...
  • SeasonJoe
  • SeasonJoe
  • 2016-06-05 10:06:22
  • 233

poj2446Chessboard 奇偶建图

/*因为要用1*2的纸片覆盖,那么两个值(i+j)必然一个奇数一个偶数,然后分别给图中的奇数偶数点依次从1开始标号,相邻的按其标号建图,匈牙利、、比较快速,正解! 因为必然是一个奇数点对应一个相邻偶数...
  • coder_coder_coder
  • coder_coder_coder
  • 2014-08-24 01:04:51
  • 346

POJ - 2446 Chessboard 二分图 最大匹配(输入坑)

题目大意:有一个n*m的棋盘,棋盘上面有k个洞。 现在要求你在这棋盘上面放1*2的矩形,使得棋盘上除k个洞之外的所有点都被1 * 2的矩形覆盖,且只覆盖一次解题思路:思路不难想到,将每一点作为两个点...
  • L123012013048
  • L123012013048
  • 2015-06-10 00:52:01
  • 647

二分图之poj2446

题目:poj2446 题意:给出一个m*n的矩阵,其中有的地方有坑,然后用1*2的纸片去覆盖图,纸片不能重复,能够把出了坑的地方其他全部覆盖的话输出YES,否则NO 分析:有一道二...
  • y990041769
  • y990041769
  • 2014-07-16 11:28:52
  • 2468

POJ 2446 Chessboard(二分图匹配)

题目大意: 首先输入m,n,k,表示一个m*n的格子,ranho
  • u011643500
  • u011643500
  • 2014-04-09 10:51:54
  • 397
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 2449
    排名: 1万+
    文章存档
    最新评论