Description
给一个n*n的01矩阵,每次可以用一行替换一列。问最少多少次操作使得整个矩阵全1
n<=1000
Solution
先考虑怎么把一整行刷成1。我们枚举全1的行设为x,若存在第x列为1的行则可以填上第x行的0,否则我们可以多操作一次任意选一个存在1的行使得某行的第x列为1,然后照做就行了
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
const int N=2005;
char s[N][N],t[N][N];
int c[N];
int main(void) {
int n; scanf("%d",&n);
bool flag=false;
rep(i,1,n) {
scanf("%s",s[i]+1);
rep(j,1,n) {
if (s[i][j]=='#') c[j]++,flag=true;
}
}
int tot=n;
rep(i,1,n) if (c[i]==n) tot--;
int ans=0x3f3f3f3f;
rep(i,1,n) {
int cnt=0;
rep(j,1,n) if (s[i][j]=='.') cnt++;
ans=std:: min(ans,cnt+tot+(!c[i]?flag:0));
}
if (!flag) ans=-1;
printf("%d\n", ans);
return 0;
}