NKOJ 1187 家的范围

NKOJ 1187 家的范围

思路:二位前缀和+计数

实现方法

  • \(k\times k\) 的小正方形有多少个,从 \((k,k)\) 开始找到 \((n,n)\) 每次用二位前缀和判断该区间是否可行。

代码

#include<cstdio>
using namespace std;
int n;
int arr[255][255];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			int x;
			scanf("%1d",&arr[i][j]);
			arr[i][j]+=arr[i-1][j]+arr[i][j-1]-arr[i-1][j-1];
		}
	}
	for(int xx=2;xx<=n;xx++){
		int cnt=0;
		for(int i=xx;i<=n;i++){
			for(int j=xx;j<=n;j++){
				int x1=i-xx+1,y1=j-xx+1,x2=i,y2=j;
				if(arr[x2][y2]-arr[x1-1][y2]-arr[x2][y1-1]+arr[x1-1][y1-1]==xx*xx){
					cnt++;
				}
			}
		}
		if(cnt==0) break;
		printf("%d %d\n",xx,cnt);
	}

	return 0;
}
posted @ 2025-04-13 15:48  hsr_ray  阅读(14)  评论(0)    收藏  举报