一、题目内容
POJ 2226 原题地址
二、题意解释
告诉你一个矩阵,让你用1 * x (x 为任意值) 的木板去铺符号* 可以覆盖
问最少多少木板能够把所有的*覆盖掉
三、代码及注释
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=2505;
int g[maxn][maxn];
int girl[maxn],used[maxn];
int n,m;
int n1,n2;
int a[55][55];
int b[55][55];
char mapp[55][55];
bool Find(int x) {
for (int i = 1; i <= n2; i++) {
if (g[x][i] && !used[i]) {
used[i] = 1;
if (girl[i] == 0 || Find(girl[i])) {
girl[i] = x;
return true;
}
}
}
return false;
}
void Build(){
n1=0;n2=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mapp[i][j]=='*'){
if(mapp[i][j-1]=='*') a[i][j]=a[i][j-1];
else a[i][j]=++n1;
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mapp[i][j]=='*'){
if(mapp[i-1][j]=='*') b[i][j]=b[i-1][j];
else b[i][j]=++n2;
g[a[i][j]][b[i][j]]=1;
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
memset(girl, 0, sizeof(girl));
memset(g, 0, sizeof(g));
for(int i=0;i<n;i++){
scanf("%s",&mapp[i]);
}
Build();
int ans=0;
for(int i=1;i<=n1;i++){
memset(used,0,sizeof(used));
if(Find(i))ans++;
}
printf("%d\n",ans);
return 0;
}