poj 2446 Chessboard
2015-11-19 21:50
387 查看
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 to cover the board. However, she thinks it too easy to bob, so she makes some holes on the board (as shown in the figure below).We call a grid, which doesn’t contain a hole, a normal grid. Bob has to follow the rules below:
1. Any normal grid should be covered with exactly one card.
2. One card should cover exactly 2 normal adjacent grids.
Some examples are given in the figures below:
A VALID solution.
An invalid solution, because the hole of red color is covered with a card.
An invalid solution, because there exists a grid, which is not covered.
Your task is to help Bob to decide whether or not the chessboard can be covered according to the rules above.
Input
There are 3 integers in the first line: m, n, k (0 < m, n <= 32, 0 <= K < m * n), the number of rows, column and holes. In the next k lines, there is a pair of integers (x, y) in each line, which represents a hole in the y-th row, the x-th column.Output
If the board can be covered, output “YES”. Otherwise, output “NO”.Sample Input
4 3 22 1
3 3
Sample Output
YESHint
A possible solution for the sample input.
Key To Problem
题目大意:给定一个n∗m的方格,问是否可以用一些1∗2的方块在有一些格点无法覆盖的情况下将剩余格点全部覆盖。题解:将这个方格想象成类似国际象棋棋盘的东西,则每个黑格子与之相邻的必定是一个白格子,这样,就可以构造出一个二分图,如果方格中两个点相邻且没有坏点,就可以将这两个格子连边,最后求方格的最大匹配就是最多可以放上的方块数量。
Code
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 35 using namespace std; struct ss { int next,to; }; ss Edge[N*N*2]; int n,m,k,tot; bool used[N*N]; bool map ; bool ll[N*N]; int head[N*N]; int f[N*N]; void clear() { tot=0; memset(head,0,sizeof(head)); memset(map,false,sizeof(map)); memset(ll,0,sizeof(ll)); } void add(int x,int y) { Edge[++tot].next=head[x]; Edge[tot].to=y; head[x]=tot; } bool dfs(int u) { for(int i=head[u];i;i=Edge[i].next) { int to=Edge[i].to; if(!used[to]) { used[to]=true; if(f[to]==-1||dfs(f[to])) { f[to]=u; return true; } } } return false; } int hungary() { int cnt=0; memset(f,-1,sizeof(f)); for(int i=1;i<=n*m;i++) { if(ll[i])continue; memset(used,0,sizeof(used)); if(dfs(i))cnt++; } return cnt; } int main() { while(scanf("%d%d%d",&n,&m,&k)!=EOF) { clear(); for(int i=1;i<=k;i++) { int x,y; scanf("%d%d",&y,&x); map[x][y]=true; } int pp=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { ll[++pp]=map[i][j]; if(map[i][j])continue; if(i-1>0&&!map[i-1][j]) { int x=(i-2)*m+j; if((i+j)&1)add(pp,x); else add(x,pp); } if(j-1>0&&!map[i][j-1]) { int x=(i-1)*m+j-1; if((i+j)&1)add(pp,x); else add(x,pp); } } } if(hungary()*2==n*m-k)puts("YES"); else puts("NO"); } return 0; }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)
- POJ 1200 Crazy Search(简单哈希)
- 【高手回避】poj3268,一道很水的dijkstra算法题
- POJ 1088 滑雪
- poj2387 Til the Cows Come Home—Dijkstra模板