思路:枚举图中所有点,预处理出每一列的空地的连续长度,然后从右下角枚举是空地的点的最大高度,左右扩展宽度
高度和宽度取一个最小值,然后算出正方形的面积,同时取最大值
#include <bits/stdc++.h>
using namespace std;
const int man=1005;
int h[man][man];
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--) {
memset(h,0,sizeof(h));
scanf("%d%d",&n,&m);
char c;
for(int i=1;i<=n;i++){
getchar();
for(int j=1;j<=m;j++){
scanf("%c",&c);
if(c=='.'){
h[i][j]=h[i-1][j]+1;
}
}
}
int m1=0,m2=0;
for(int i=n;i>=1;i--){
for(int j=m;j>=1;j--){
if(!h[i][j]) continue;
int mi=h[i][j];
for(int k=j;k&&h[i][k];k--){
mi=min(mi,h[i][k]);
int aaa = min(mi,j-k+1);
int m=aaa*aaa;
if(m>=m1) m1=m;
}
}
}
printf("%d\n",m1);
}
return 0;
}
本题和牛客暑假训练第二场基本一样https://blog.youkuaiyun.com/Daxian911/article/details/96768808