如果没有黑格子直接输出1
记录当前所有黑格子中列最靠左的minc,最靠右的maxc,行最靠上的minr,最靠下的maxr
如果maxc-minc+1=maxr-minr+1,那么一定能填出正方形,只要拿面积减去black个数即可
如果不等,那答案最小的正方形边长一定是max(maxr-minr+1,maxc-minc+1)
也就是填成长方形以后再补成正方形
看看剩下的行或列够不够补成正方形即可
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <utility>
#include <map>
#include <stack>
#include <set>
#include <vector>
#include <queue>
#include <deque>
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define LL long long
#define Pair pair<int,int>
#define LOWBIT(x) x & (-x)
using namespace std;
const int INF=0x7ffffff;
int n,m;
char a[101][101];
int main ()
{
int i,j;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%s",a[i]+1);
int minc=INF,maxc=-INF,minr=INF,maxr=-INF,cnt=0;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (a[i][j]=='B')
{
cnt++;
minc=min(minc,j);
maxc=max(maxc,j);
minr=min(minr,i);
maxr=max(maxr,i);
}
if (cnt==0)
{
printf("1\n");
return 0;
}
if (maxr-minr==maxc-minc)
{
printf("%d\n",(maxr-minr+1)*(maxr-minr+1)-cnt);
return 0;
}
if (maxr-minr<maxc-minc)
{
int ss=maxc-minc+1;
int rr=maxr-minr+1,cc=maxc-minc+1;
int rem=n-rr;
if (rem<cc-rr)
printf("-1\n");
else
printf("%d\n",ss*ss-cnt);
}
else
{
int ss=maxr-minr+1;
int rr=maxr-minr+1,cc=maxc-minc+1;
int rem=m-cc;
if (rem<rr-cc)
printf("-1\n");
else
printf("%d\n",ss*ss-cnt);
}
return 0;
}