我的思路:二维前缀和判断一个矩阵内是否全是0,用line1[j] 记录从位置j 往后连续1的个数,用line2[i][j] 表示从(i,j) 开始往上连续1的个数。
写着写着脑子就写糊了,不小心把思路搞麻烦了,抱歉(
但是下面的代码过不了这个数据:
8
00010010
00011111
00011110
11111110
00011000
00011000
00011000
00001000
应输出 7,此代码输出 1。
代码如下:
#include<cstdio>
using namespace std;
bool m[2020][2020];
int qzh[2020][2020];
int line1[2020],line2[2020][2020];
int n,_max=0;
bool check(int mid,int i,int j)
{
// printf("mid:%d l1:%d l2:%d\n",mid,line1[j-mid],line2[i+mid][j]);
if( line1[j-mid] >= ((mid<<1)|1) && line2[i+mid][j] >= ((mid<<1)|1) &&
qzh[i-1][j-1] - qzh[i-mid-1][j-1] - qzh[i-1][j-mid-1] + qzh[i-mid-1][j-mid-1] == 0 &&
qzh[i-1][j+mid] - qzh[i-1][j] - qzh[i-mid-1][j+mid] + qzh[i-mid-1][j] == 0 &&
qzh[i+mid][j-1] - qzh[i+mid][j-mid-1] - qzh[i][j-1] + qzh[i][j-mid-1] == 0 &&
qzh[i+mid][j+mid] - qzh[i][j+mid] - qzh[i+mid][j] + qzh[i][j] == 0)
return 1;
return 0;
}
bool read()
{
char c=getchar();
while(c<'0'||c>'1')c=getchar();
return c-'0';
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
// freopen("redcross.in","r",stdin);
// freopen("redcross.out","w",stdout);
scanf("%d",&n);
char c;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)m[i][j]=read();
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
qzh[i][j] = qzh[i-1][j] + qzh[i][j-1] - qzh[i-1][j-1] + m[i][j];
if(m[j][i] == 1) line2[j][i] = line2[j-1][i] + 1;
else line2[j][i] = 0;
}
}
// printf("\n");
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++)
// {
// printf("%d ",line2[i][j]);
// }
// printf("\n");
// }
// printf("\n");
bool f=0;
int l=1,r=n,mid;
for(int i=1;i<=n;i++)
{
for(int j=n;j>=1;j--)
{
if(m[i][j] == 1) line1[j] = line1[j+1]+1;
else line1[j] = 0;
}
// for(int j=1;j<=n;j++)
// {
// printf("%d ",line1[j]);
// }
// printf("\n");
for(int j=1;j<=n;j++)
{
if(m[i][j] == 1)
{
f=1;
l=1,r=min(min(i-1,j-1),min(n-i,n-j))+1;
// printf("%d %d, %d %d\n",i,j,l,r);
while(l<r)
{
// printf("%d %d\n",l,r);
mid=(l+r)>>1;
if(check(mid,i,j)){
//i-mid>=1&&j-mid>=1&&i+mid<=n&&j+mid<=n&&
// if((mid<<1)|1==5)printf("5: %d %d\n\n",l,r);
_max = max(_max,((mid<<1)|1)),l=mid+1;}
else r=mid;
}
}
}
}
if(f==1) printf("%d",max(1,_max));
else printf("0");
// fclose(stdin);
// fclose(stdout);
return 0;
}
求大佬指教!孩子要急死了QwQ