求助一道站外水题
  • 板块学术版
  • 楼主Kio_
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/9/25 20:23
  • 上次更新2023/11/5 12:38:25
查看原帖
求助一道站外水题
127925
Kio_楼主2020/9/25 20:23

我的思路:二维前缀和判断一个矩阵内是否全是0,用line1[j]line1[j] 记录从位置jj 往后连续1的个数,用line2[i][j]line2[i][j] 表示从(i,j)(i,j) 开始往上连续1的个数。

写着写着脑子就写糊了,不小心把思路搞麻烦了,抱歉(

但是下面的代码过不了这个数据:

8
00010010
00011111
00011110
11111110
00011000
00011000
00011000
00001000

应输出 77,此代码输出 11

代码如下:

#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

2020/9/25 20:23
加载中...