wxh-b2
本
题
虽
然
很
容
易
想
,
但
就
像
C
S
P
T
2
一
样
多
坑
本题虽然很容易想,但就像CSPT2一样多坑
本题虽然很容易想,但就像CSPT2一样多坑
———————————————————————————————
- 只要一行一列中有一个就可以用这一列
- 判断一行一列要用或
——————————————————————————
#include<bits/stdc++.h>
using namespace std;
const int N=502;
int n;
char s[N][N];
vector <int> sum[N];
vector <int> ::iterator it;
bool ll[N];
int main(){
scanf("%d",&n);
bool flag0=false;
int stmp=0;
for(int i=1;i<=n;i++){
scanf("%s",(s[i]+1));
for(int j=1;j<=n;j++)
{
if(s[i][j]=='.'){
sum[i].push_back(j);
}
if(s[i][j]=='#') flag0=true;
}
}
for(int i=1;i<=n;i++){
bool flagg=0;
for(int j=1;j<=n;j++){
if(s[j][i]=='#') {ll[i]=1;}
else {ll[i]=ll[i]|0;flagg=1;}
}
if(!flagg)
{
stmp++;
}
}
if(!flag0) {
puts("-1");
exit(0);
}
int ans=N*N;
for(int i=1;i<=n;i++){
int l=sum[i].size();
int add=0;
if(l==n){
if(!ll[i]){
continue;
}
else add+=n+n,ans=min(ans,add);
}
else{
if(l==0){
ans=min(ans,n-stmp);
continue;
}
if(!ll[i]){
ans=min(ans,1+n-stmp+l);
continue;
}
ans=min(ans,n-stmp+l);
}
}
printf("%d",ans);
}