有一天,罗老板画了一块尺寸为M * N的棋盘。他希望许老师能够使用1 * 2的牌来覆盖棋盘。然而,他认为这很容易,所以他增大了难度,他在棋盘上打了一些洞
许老师必须遵守以下规则: 1.任何不是洞网格都应该只被一张卡覆盖。 2. 一张卡应该正好覆盖2个相邻非洞网格。 3. 洞不可以被卡片覆盖
如果存在一种方案覆盖棋盘就输出YES,否则输出 NO。
WA代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int m,n,k,a[100][100],g[1500][1500],tot=0,ans=0;
int cover[1500],link[1500];
bool find(int x)
{
for(int i=1;i<=tot;i++)
{
if(g[x][i]==1&&!cover[i])
{
cover[i]=1;
int p=link[i];
link[i]=x;
if(p==0||find(p))
{
return true;
}
link[i]=p;
}
}
return false;
}
int main()
{
memset(a,0,sizeof(a));
memset(g,0,sizeof(g));
memset(link,0,sizeof(link));
cin>>m>>n>>k;
for(int i=1;i<=k;i++)
{
int x,y;
cin>>x>>y;
a[x][y]=-1;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]!=-1) a[i][j]=++tot;
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==-1||(i+j)%2!=0) continue;
if(a[i][j+1]!=-1&&j+1<=n) g[a[i][j]][a[i][j+1]]=1;
if(a[i][j-1]!=-1&&j-1>=1) g[a[i][j]][a[i][j-1]]=1;
if(a[i+1][j]!=-1&&i+1<=m) g[a[i][j]][a[i+1][j]]=1;
if(a[i-1][j]!=-1&&i-1>=1) g[a[i][j]][a[i-1][j]]=1;
}
}
for(int i=1;i<=tot;i++)
{
memset(cover,0,sizeof(cover));
if(link[i]==0&&find(i)) ans++;
}
if(ans*2==n*m-k) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}