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;
}