这咋都能对啊
查看原帖
这咋都能对啊
100325
peterwuyihong楼主2021/4/3 11:59
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 250*250
#define maxm 250*250*16
using namespace std;
int n,k,x,y,tot=1,ans;bool Map[250][250];
int head[maxn],Next[maxm],ver[maxm];
short dx[8]={1,1,2,2,-1,-1,-2,-2};
short dy[8]={2,-2,1,-1,2,-2,1,-1};
int query[maxn],cnt;
bool v[maxn];int match[maxn];
void add(int x,int y)
{
	ver[++tot]=y;
	Next[tot]=head[x];
	head[x]=tot;
}
bool dfs(int x)
{
	for(int i=head[x],y;i;i=Next[i])
	if(!v[y=ver[i]])
	{
		v[y]=1;
		if(match[y]==0||dfs(match[y]))
		{
			match[y]=x;
			return 1;	
		}
	}
	return 0;
}
int main()
{
	scanf("%d %d",&n,&k);
	for(int i=1;i<=k;i++)
	{
		scanf("%d %d",&x,&y);
		Map[x][y]=1;
	}
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	if(!Map[i][j])
	{
		query[++cnt]=i*250+j;
		for(int Case=0;Case<4;Case++)
		{
			int tx=i+dx[Case],ty=j+dy[Case];
			if(Map[tx][ty])continue;
			if(tx<1||ty<1||tx>n||ty>n)continue;
		//	printf("Link (%d,%d) and (%d,%d)\n",i,j,tx,ty);
			add(tx*250+ty,i*250+j);
			add(i*250+j,tx*250+ty);
		}
	}
	for(int i=1;i<=cnt;i++)
	memset(v,0,sizeof v),ans+=dfs(query[i]);
	printf("%d\n",n*n-k-(ans>>1));
}

RTRT,其中

for(int Case=0;Case<4;Case++)

应改为

for(int Case=0;Case<8;Case++)
2021/4/3 11:59
加载中...