POJ2446

题目链接:http://poj.org/problem?id=2446

题目大意:

  给一个m*n的方格阵,阵中有 k 个洞,在阵中放入 1*2 规格的小矩形片,洞上不能放矩形片,问能不能用矩形片把所有非洞的方块填满。(说的不太好。。。)

解题思路:

  思路很明确,把方格阵上除了洞之外的小方块分成两种:横纵坐标之和为奇数、横纵坐标之和为偶数,然后求出横纵坐标之和为奇(偶)数的最大匹配数 M ,如果 M == (m*n-k)/2,输出 YES,否则输出 NO。里面有几个坑,我在代码中标注出来了。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int cx[4]={0,0,1,-1}, cy[4]={1,-1,0,0};
 6 bool hole[200][200],vis[200][200];
 7 int to[200][200],m,n;
 8 bool finds(int x,int y){
 9     for(int i=0;i<4;i++){
10         int dx=x+cx[i],dy=y+cy[i];
11         if(dx>0&&dx<=m&&dy>0&&dy<=n&&!vis[dx][dy]&&!hole[dx][dy]){
12             vis[dx][dy]=true;
13             if(to[dx][dy]==0||finds((to[dx][dy]-1)/n+1,(to[dx][dy]-1)%n+1)){//这里要注意finds()函数中的参数,一开始表示错误,WA了几发。
14                 to[dx][dy]=(x-1)*n+y;
15                 return true;
16             }
17         }
18     }
19     return false;
20 }
21 int main(){
22     int k,x,y;
23     while(scanf("%d%d%d",&m,&n,&k)==3){
24         memset(hole,false,sizeof(hole));
25         memset(to,0,sizeof(to));
26         for(int i=0;i<k;i++){
27             scanf("%d%d",&x,&y);//注意,x是列,y才是行,大坑。
28             hole[y][x]=true;
29         }
30         if((m*n-k)%2!=0){
31             printf("NO\n");
32             continue;
33         }
34         int ok=0;
35         int ji=0;
36         for(int i=1;i<=m;i++){
37             for(int j=1;j<=n;j++){
38                 if((i+j)%2==1||hole[i][j])  continue;
39                 memset(vis,false,sizeof(vis));
40                 if(finds(i,j))
41                     ok++;
42             }
43         }
44         if(ok==(m*n-k)/2)  printf("YES\n");
45         else    printf("NO\n");
46     }
47     return 0;
48 }
时间: 2024-10-25 09:41:32

POJ2446的相关文章

二分图之poj2446

题目:poj2446 题意:给出一个m*n的矩阵,其中有的地方有坑,然后用1*2的纸片去覆盖图,纸片不能重复,能够把出了坑的地方其他全部覆盖的话输出YES,否则NO 分析:有一道二分图经典题目,当然难点还是建图,一直没有思路,早上来忽然想到可以用(i-1)*m+j 吧矩阵中每个点转化为一个数,然后相邻连接起来建图,匈牙利,但是不知道为什么不对?求大神解释.还是理解不够深. 很多人都是按其奇偶性建图的,因为要用1*2的纸片覆盖,那么两个值(i+j)必然一个奇数一个偶数,然后分别给图中的奇数偶数点依

的二分图poj2446

称号:id=2446">poj2446 意甲冠军:给定一个m*n矩阵,在有些地方坑,然后1*2本文叠加,反复.可以把出了坑的地方其它所有覆盖的话输出YES,否则NO 分析:有一道二分图经典题目,当然难点还是建图,一直没有思路,早上来忽然想到能够用(i-1)*m+j 吧矩阵中每一个点转化为一个数,然后相邻连接起来建图,匈牙利,可是不知道为什么不正确?求大神解释.还是理解不够深. 非常多人都是按其奇偶性建图的,由于要用1*2的纸片覆盖,那么两个值(i+j)必定一个奇数一个偶数.然后分别给图中的

POJ2446(二分图最大匹配)

Chessboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16924   Accepted: 5284 Description Alice and Bob often play games on chessboard. One day, Alice draws a board with size M * N. She wants Bob to use a lot of cards with size 1 * 2

POJ2446 Chessboard【二分图最大匹配】

题目链接: http://poj.org/problem?id=2446 题目大意: 给一个N*M的矩阵,其中有K个地方有坑.告诉你这K个坑的位置,现在要用1*2的矩形板去覆盖 矩阵,不能覆盖有坑的地方.问:是否能把除了坑之外的地方全部覆盖掉,如果能,则输出"YES", 否则输出"NO". 思路: 考虑到矩形板的规格是1*2,则相邻位置的(i,j)和(x,y)必然是(i+j)为奇数的话,(x+y)则为偶数. (i+j)为偶数的话,(x+j)则为奇数.这样,就可以把图

[POJ2446] Chessboard(二分图最大匹配-匈牙利算法)

传送门 把所有非障碍的相邻格子彼此连一条边,然后求二分图最大匹配,看 tot * 2 + k 是否等于 n * m 即可. 但是连边不能重复,比如 a 格子 和 b 格子 相邻,不能 a 连 b ,b 也连 a. 所以可以人为规定,横纵坐标相加为 奇数 的格子连横纵坐标相加为 偶数 的格子. 如果一个格子横纵坐标相加为奇数,那么它的上下左右四个格子横纵坐标相加必定为偶数. ——代码 1 #include <cstdio> 2 #include <cstring> 3 4 using

poj2446 Chessboard 【最大匹配】

题目大意:一个n*m的棋盘,某些格子不能用,问用1*2的骨牌能否完全覆盖这个棋盘,当然,骨牌不能有重叠 思路:显然黑白染色后,一个骨牌只能覆盖一个白色格子和一个黑色格子,然后我们间二染色建图,看能否有完美匹配即可TUT #include <iostream>#include <cstdio>#include <string.h>#define maxn 10000using namespace std;const int dx[10]={0,0,0,-1,1};cons

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

ACM算法总结及刷题参考

参考:http://bbs.byr.cn/#!article/ACM_ICPC/11777 OJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965)    (2)贪心(poj1328,poj2109,poj2586)    (3)递归和分治法.     (4)递推.     (5)构造法.(po

poj 2495 Incomplete chess boards 覆盖问题巧解

题意: 给一个8*8的棋盘,上面有2格被挖掉,判断是否可以用1*2的长方形覆盖棋盘. 分析: poj2446用的二分图匹配是这一类问题的通解.但这题只有恰好2个点被挖,所以有简便做法.可以把整个棋盘黑白染色(就像国际象棋那样),如果挖去的同色,则无法覆盖(这样导致剩余黑色格子数不等于白色格子数,每个1*2的长方形恰好覆盖一个黑色格和一个白色格). 代码: //poj 2495 //sep9 #include<iostream> using namespace std; int main() {