一、题目内容
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;
}
转载请注明原文地址:https://blackberry.8miu.com/read-6771.html