https://vjudge.net/contest/238849#problem/G
题目的意思:'#'是石油,有个人挖石油,采集石油的工具可以覆盖一个10米乘20米的长方形,采集时工具不能碰到海水,每一格长10米,二分匹配;
#include<stdio.h>
#include<string.h>
#include<string>
#include<queue>
#include<iostream>
#include<algorithm>
const int inf=0x3f3f3f3f;
using namespace std;
int g[602][602];
int vis[602];
int line[602];
int sum;
int find1(int v)
{
for(int i=1; i<=sum; i++)
{
if(vis[i]==0&&g[v][i])
{
vis[i]=1;
if(line[i]==-1||find1(line[i]))
{
line[i]=v;
return 1;
}
}
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
int r=0;
char a[602][602];
int pos[602][602];
while(t--)
{
int n;
scanf("%d",&n);
memset(g,0,sizeof(g));
memset(pos,0,sizeof(pos));
memset(vis,0,sizeof(vis));
memset(line,-1,sizeof(line));
sum=0;
for(int i=0; i<n; i++)
{
scanf("%s",a[i]);
for(int j=0; j<n; j++)
if(a[i][j]=='#')//编号
pos[i][j]=++sum;
}
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
if(a[i][j]=='#')//上下左右有石油的话就将这两块联系一下
{
if(i-1>=0&&a[i-1][j]=='#')
g[pos[i][j]][pos[i-1][j]]=1;
if(i+1<n&&a[i+1][j]=='#')
g[pos[i][j]][pos[i+1][j]]=1;
if(j-1>=0&&a[i][j-1]=='#')
g[pos[i][j]][pos[i][j-1]]=1;
if(j+1<n&&a[i][j+1]=='#')
g[pos[i][j]][pos[i][j+1]]=1;
}
}
int ans=0;
for(int i=1; i<=sum; i++)
{
memset(vis,0,sizeof(vis));
if(find1(i))
ans++;
}
printf("Case %d: %d\n",++r,ans/2);
}
}