[POJ2446]求助!!
  • 板块学术版
  • 楼主demonlover
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/8/7 20:02
  • 上次更新2023/11/3 05:19:59
查看原帖
[POJ2446]求助!!
162025
demonlover楼主2023/8/7 20:02

有一天,罗老板画了一块尺寸为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;
}
2023/8/7 20:02
加载中...