1971: #6030. 「雅礼集训 2017 Day1」矩阵

题目描述

有一个 n×n n \times nn×n 的矩阵,每个位置 (i,j) (i, j)(i,j) 如果是.表示为白色,如果是#表示为黑色。

初始时,每个位置可以是黑色或白色的,(i,j) (i, j)(i,j) 位置的值会作为 ai,j a_{i, j}ai,j 给你。

现在有一种操作,选择两个整数 i,j∈[1,n] i, j \in [1, n]i,j∈[1,n],记 (i,1),(i,2),…,(i,n) (i, 1), (i, 2), \ldots, (i, n)(i,1),(i,2),…,(i,n) 的颜色为 C1,C2,…Cn C_1, C_2, \ldots C_nC1,C2,…Cn,将 (1,j),(2,j),…,(n,j) (1, j), (2, j), \ldots, (n, j)(1,j),(2,j),…,(n,j) 的颜色赋为 C1,C2,…,Cn C_1, C_2, \ldots, C_nC1,C2,…,Cn。

你的任务是将整个矩阵变成全黑,如果能够办到,输出最少步数,否则输出 −1 -1−1。

输入

第一行一个整数 n nn。 接下来 n nn 行,每行 n nn 个字符表示整个矩阵。

输出

输出只有一行,一个整数表示答案。

样例输入 

2
#.
.#

样例输出 

3

提示

对于 30% 30\%30% 的数据,n≤4 n \leq 4n≤4;
对于另外 20% 20\%20% 的数据,满足每一列都至少有一个黑色的格子;
对于 100% 100\%100% 的数据,1≤n≤1000 1 \leq n \leq 10001≤n≤1000。

#include<cstdio>
#include<algorithm>
#include<iostream>

using namespace std;

#define N 1001

int h[N],l[N];

char s[N];

int main()
{
    int n;
    scanf("%d",&n);
    bool ok=false;
    for(int i=1;i<=n;++i)
    {
        scanf("%s",s+1);
        for(int j=1;j<=n;++j)
            if(s[j]=='#') 
            {
                ok=true;
                h[i]++;
                l[j]++;
            }
    }
    if(!ok) 
    {
        puts("-1");
        return 0;
    }
    int ans=n;
    for(int i=1;i<=n;++i) ans=min(ans,n-h[i]+!l[i]);
    int sum=0;
    for(int i=1;i<=n;++i) sum+=l[i]!=n; 
    cout<<ans+sum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值