NOIO2 要来了,考前要练练暴力,要不挂了怎么办呢。
因为(1le n,m le 25) 的数据范围,我们可以写一个暴力。枚举矩形的左上端点和右下端点,然后判断边框是否有1
,如果合法就取(max),否则就break
。
Tips:
- 注意是判断边框即可。
- 在判断边框的时,可以用 4 个
while
猛冲,如果中途结束,那么说明边框不合法。 - 枚举左上端点((x1,y1))和右下端点((x2,y2))时注意(x2ge x1,y2ge y1)。
#include<bits/stdc++.h>
using namespace std;
char ch[30][30];
int ans;
int main() {
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
cin>>ch[i][j];
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
for(int k=i;k<=n;k++) {
for(int l=j;l<=m;l++) {
int I=i,J=j;
while(J<l&&ch[I][J]=='0') J++;
if(J!=l) break;
while(I<k&&ch[I][J]=='0') I++;
if(I!=k) break;
while(J>j&&ch[I][J]=='0') J--;
if(J!=j) break;
while(I>i&&ch[I][J]=='0') I--;
if(I!=i) break;
ans=max(ans,2*(k-i+1+l-j+1));
}
}
}
}
cout<<ans<<endl;
return 0;
}