Codeforces Round #423 B. Black Square

来源:互联网 发布:mac dock栏 图标合并 编辑:程序博客网 时间:2024/05/17 10:03

题目网址: Codeforces Round #423 B. Black Square

题意分析:

题目给出 n*m个格子, 涂黑色或白色. 要求将黑色块涂成一个正方形区域,不包含白色块, 若不能这么做, 则输出-1.若能, 输出最少需要涂成黑色的次数

  • 用变量t记录黑色块出现的最上方
  • 用变量l记录黑色块出现的最左边
  • 用变量r记录黑色块出现的最右边
  • 用变量b记录黑色块出现的最下方
  • 用cnt记录当前出现的黑色块数
  • 求出当前横向方向距离 col = r-l
  • 求出当前纵向方向距离 row = b-t
  • col, row 较大者则为正方向的边长len
  • 此时判断len 会不会越界, 即 大于n 或 大于 m
  • 会则输出 -1, 不会则 len*len - cnt即为所求.
  • 注意没有黑色方块出现时, 结果 为 1

代码:

#include <iostream>using namespace std;const int SIZE = 105;char sheet[SIZE][SIZE];int main(int argc, char const *argv[]){    int n, m;    while (~scanf("%d %d", &n, &m))    {        getchar();        for (int i = 0; i < n; ++i)        {            for (int j = 0; j < m; ++j)            {                scanf("%c", &sheet[i][j]);            }            getchar();        }        int t = SIZE, l = SIZE, r = -1, b = -1;        int cnt = 0;        for (int i = 0; i < n; ++i)        {            for (int j = 0; j < m; ++j)            {                if(sheet[i][j] == 'B')                {                    ++cnt;                    t = min(t, i);                    l = min(l, j);                    r = max(r, j);                    b = max(b, i);                }            }        }        int row = abs(b - t) + 1, col = abs(r - l) + 1;        int len = max(row, col);        if(cnt == 0)        {            printf("1\n");        }        else if(len > n || len > m)        {            printf("-1\n");        }        else         {            printf("%d\n", len*len - cnt);        }    }    return 0;}