http://codeforces.com/contest/828/problem/B
题目大意,给出一个n*m的纸,里面的方格为白色或者黑色,要求描最少的白色格子使得黑色为一个正方形。如果不存在这种解法则输出-1.
解法:先得到黑色格子的最上最下最左最右的坐标,然后枚举。
代码如下:
#include<bits/stdc++.h>
using namespace std;
char G[105][105];
int find(int lx, int rx, int ty, int ly) {
int cnt = 0;
for(int j = ty; j <= ly; j++) {
for(int i = lx; i <= rx; i++) {
if(G[j][i] != 'B') {
cnt++;
}
}
}
return cnt;
}
int main() {
int n, m, lx = 105, rx = -1, ty = 105, ly = -1, ans = 0x3f3f3f3f, big;
cin >> n >> m;
for(int i = 0; i < n; i++)
scanf("%s", &G[i]);
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(G[i][j] == 'B') {
if(j < lx)
lx = j;
if(j > rx)
rx = j;
if(i < ty)
ty = i;
if(i > ly)
ly = i;
}
}
}
if(lx != 105 && rx - lx >= ly - ty) {
big = rx - lx;
for(int i = 0; i + big < n; i++) {
if(i <= ty && i + big >= ty) {
ans = min(ans, find(lx, rx, i, i + big));
}
}
}
if(lx != 105 && rx - lx <= ly - ty) {
big = ly - ty;
for(int i = 0; i + big < m; i++) {
if(i <= lx && i + big >= rx) {
ans = min(ans, find(i, i + big, ty, ly));
}
}
}
if(lx != 105 && ans == 0x3f3f3f3f)
cout << "-1" << endl;
else if(ans == 0x3f3f3f3f)
cout << "1" << endl;
else
cout << ans << endl;
return 0;
}