Codeforces Round #423 B. Black Square

来源:互联网 发布:mysql date转字符串 编辑:程序博客网 时间:2024/05/17 20:00

Problem

n×m 的方格纸,每格的颜色为黑或白。是否存在一种涂色方案,将白格子涂黑,使得所有黑格恰好构成一个正方形?若存在,输出最小的涂色数,否则输出 -1 .

限制条件

1n,m100

解法

由于统计所有黑格能否构成正方形。考虑枚举每格的颜色,找到最左、最右、最上、最下的黑格位置,其构成的矩形必然要被结果正方形包含。则最小构成即为 max(width, height) 作为正方形的边长。

HINT: 需考虑正方形边长应不大于方格纸大小。

minAns = 总面积减去原有黑格数

代码

#include<bits/stdc++.h>using namespace std;int main(){    char mp[110][110];    int n, m;    scanf("%d %d", &n, &m);    for(int i=1;i<=n;i++)        scanf(" %s", mp[i]+1);    int l = m+1, r = 0, d = 0, u = n+1, ori = 0;    for(int i=1;i<=n;i++)    for(int j=1;j<=m;j++)        if(mp[i][j] == 'B')        {            ori++;            l = min(l, j);            r = max(r, j);            u = min(u, i);            d = max(d, i);        }    if(ori == 0)        printf("1\n");    else    {        int h = (d-u+1),    w = (r-l+1);        h = max(h, w),  w = max(h, w);        if(h > m || w > n)  printf("-1\n");        else    printf("%d\n", h*w-ori);    }}
原创粉丝点击