题意
现在有一个n*n的01矩阵,现在每次可以把某一列替换成某一行,问最少操作次数使得整个矩阵都是1。
n≤1000n≤1000
分析
把矩阵变成全1显然只能先把某一行变成全1,然后再把所有不是全1的列变成全1。
那么我们枚举每一行,然后求先把这行变成全1的最小代价。
而要把这行变成全1,设这是第x行,就要每次选择某一行满足其第x列是1,然后来填充第x行的0。
若不存在某行的第x列是1,我们也可以通过先操作一次使得某行的第x列是1。
然后取个最小值就是答案。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
const int N=1005;
const int inf=1000000000;
int n,c[N];
bool a[N][N],vis[N];
char str[N];
int main()
{
scanf("%d",&n);
int flag=inf;
for (int i=1;i<=n;i++)
{
scanf("%s",str+1);
for (int j=1;j<=n;j++)
if (str[j]=='#') a[i][j]=1,vis[j]=1,c[j]++,flag=1;
else a[i][j]=0;
}
int ret=n,ans=inf;
for (int i=1;i<=n;i++) if (c[i]==n) ret--;
for (int i=1;i<=n;i++)
{
int s=0;
for (int j=1;j<=n;j++)
if (!a[i][j]) s++;
ans=std::min(ans,s+ret+(!vis[i]?flag:0));
}
if (ans==inf) ans=-1;
printf("%d",ans);
return 0;
}