题意:给出一个矩形N*M棋盘,有K个格子是空洞,然后用2*1的矩形,对所有非空洞的格子进行覆盖,如果可以全部覆盖,就输出YES;
思路:和HDU1507差不多,而且还简单点不用输出组合,见代码
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=1000+5;
struct Max_Match
{
int n,m;
vector<int> g[maxn];
bool vis[maxn];
int left[maxn];
void init(int n,int m)
{
this->n=n;
this->m=m;
for(int i=1; i<=n; ++i) g[i].clear();
memset(left,-1,sizeof(left));
}
bool match(int u)
{
for(int i=0;i<g[u].size();++i)
{
int v=g[u][i];
if(!vis[v])
{
vis[v]=true;
if(left[v]==-1 || match(left[v]))
{
left[v]=u;
return true;
}
}
}
return false;
}
int solve()
{
int ans=0;
for(int i=1; i<=n; ++i)
{
memset(vis,0,sizeof(vis));
if(match(i)) ++ans;
}
return ans;
}
}MM;
int cas=1;
int mapp[maxn][maxn];
int n,m;
struct Node
{
int x,y;
Node(){}
Node(int x,int y):x(x),y(y){}
}node1[maxn],node2[maxn];
bool check(int i,int j)
{
if (node1[i].x+1==node2[j].x && node1[i].y==node2[j].y)
return true;
if (node1[i].x-1==node2[j].x && node1[i].y==node2[j].y)
return true;
if (node1[i].x==node2[j].x && node1[i].y+1==node2[j].y)
return true;
if (node1[i].x==node2[j].x && node1[i].y-1==node2[j].y)
return true;
return false;
}
int main()
{
int k;
while(scanf("%d%d%d",&n,&m,&k)!=EOF && n)
{
int kk = k;
memset(mapp,0,sizeof(mapp));
while (k--)
{
int r,c;
scanf("%d%d",&r,&c);
mapp[c][r]=-1;
}
int num1=0,num2=0;
for (int i = 1;i<=n;i++)
for (int j = 1;j<=m;j++)
if (mapp[i][j]==0)
{
if ((i+j)%2==0)
node1[++num1]=Node(i,j);
else
node2[++num2]=Node(i,j);
}
MM.init(num1,num2);
for (int i = 1;i<=num1;i++)
for (int j = 1;j<=num2;j++)
if (check(i,j))
{
MM.g[i].push_back(j);
}
// printf("%d\n",MM.solve());
// printf("%d %d %d\n",n,m,kk);
printf("%s\n",(MM.solve()*2 == (n*m-kk)) ?"YES":"NO");
}
return 0;
}
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
YES
Hint
A possible solution for the sample input.