Codeforces 828 B Black Square

来源:互联网 发布:空间数据的逻辑运算 编辑:程序博客网 时间:2024/05/17 12:22

题目地址:http://codeforces.com/contest/828/problem/B
题目意思:给你一个广场,上面有黑色和白色的瓷砖,你可以把白色的瓷砖换成黑色的瓷砖,求最少要多少块黑色瓷砖来换才能构成一个黑色的正方形。
思路:求出最小的正方形能包裹住所有的黑色方块,如果边长大于原本广场的最小的边输出-1,要不然输出这个正方形所需的瓷砖总数-已有黑色瓷砖数。

#include <iostream>#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#define LL long long #define N 110#define M 50010#define inf 0x3f3f3f3fusing namespace std;const LL mod = 1e9 + 7;const double eps = 1e-9;char mapp[N][N];int main() {    cin.sync_with_stdio(false);    int n, m;    int ans, cnt;    int x1, x2, y1, y2;    while (cin >> n >> m) {        ans = 0;        x1 = inf, x2 = -1, y1 = inf, y2 = -1;        for (int i = 0; i < n; i++) {            for (int j = 0; j < m; j++) {                cin >> mapp[i][j];                if (mapp[i][j] == 'B') {                    x1 = min(x1, i);                    y1 = min(y1, j);                    x2 = max(x2, i);                    y2 = max(y2, j);                    ans++;                }            }        }        if (x1 == inf) {            cout << 1 << endl;        }        else {            cnt = max(x2 - x1, y2 - y1) + 1;            if (cnt > n || cnt > m) {                cout << -1 << endl;                continue;            }            cout << cnt*cnt - ans << endl;        }    }    return 0;}
原创粉丝点击