【Codeforces Round #423 (Div. 2) B】Black Square

【Link】:http://codeforces.com/contest/828/problem/B

【Description】



给你一个n*m的格子;

里面包含B和W两种颜色的格子;

让你在这个格子中画一个正方形;

(大小,位置自己选但要求覆盖到所有现有的黑棋子);

然后,把里面的白棋子,染成黑棋子;

问你最少需要染多少个白棋子;

【Solution】



先得到一个矩形(这个矩形覆盖所有的黑棋子);

然后枚举所需要的正方形的左上角的位置;

这个正方形必然要覆盖这个矩形;

则这个左上角只能在这个正方形的左上角的左上方,或和正方形的左上角重合;

取那个矩形的右下角,只要正方形能够覆盖到右下角,就能覆盖整个矩形;

剩下的就不难写了;

获取正方形应该有的最小边长;

然后统计这个正方形里面W的个数就好;



【NumberOf WA】



0



【Reviw】



做题的时候不用着急:)

慢慢想



【Code】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 110; int n,m,mini = N,maxi = 0,minj = N,maxj = 0;
char s[N][N]; int main(){
scanf("%d%d",&n,&m);
rep1(i,1,n) scanf("%s",s[i]+1);
rep1(i,1,n){
rep1(j,1,m)
if (s[i][j]=='B'){
mini = min(mini,i);
maxi = max(maxi,i);
minj = min(minj,j);
maxj = max(maxj,j);
}
}
if (maxi==0){
printf("1\n");
return 0;
}
int num = N*N;
rep1(i,1,n){
rep1(j,1,m){
if (i <= mini && j <= minj){
int lenj = maxj-j+1,leni = maxi-i+1;
lenj = max(lenj,leni);
int rj = j + lenj-1,ri = i + lenj -1;
if (rj > m || ri > n) continue;
int temp = 0;
rep1(ii,i,ri)
rep1(jj,j,rj)
if (s[ii][jj]=='W')
temp++;
num = min(num,temp);
}
}
}
if (num > n*n)
printf("-1\n");
else
printf("%d\n",num);
return 0;
}
上一篇:【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers


下一篇:【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory