4
题解 : 二分图匹配 将每一个池塘标记出来 , 然后 对陆地做二分图匹配,如下图 能看得懂把 然后多判断几个做
一下二分图匹配就ok了。
献上代码:
#include <cstdio>
#include <cstring>
bool wat[101][101],map[101][101],use[101][101];
int n,m,k,ans,px,py;
int from[101][101][2],t[5]={0,1,-1,0,0},tt[5]={0,0,0,1,-1};
bool find(int x,int y)
{
for(int i=1;i<=4;i++)//向四周搜索可行的增广路
{
px=x+t[i];py=y+tt[i];
if(px<=0||px>n||py<=0||py>m||wat[px][py])continue;
if (!wat[px][py] && !use[px][py]&& !map[px][py])//排除水塘
{
use[px][py]=true;
if((!from[px][py][0])||(find(from[px][py][0],from[px][py][1])))
{
from[px][py][0]=x;
from[px][py][1]=y;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
int x,y;
for(int i=1;i<=k;i++)
{
scanf("%d%d",&x,&y);
wat[x][y]=true;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if((i % 2 && j % 2) || (i%2==0 && j%2==0))map[i][j]=1;//选出红色的1
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(!wat[i][j]&&map[i][j])
{
memset(use, 0, sizeof(use));
if(find(i,j))ans++;
}
}
}
printf("%d",ans);
return 0;
}