给一个二维的01矩阵,求边长为N,面积为N*N的正方形的个数,可以重合。
直接利用dp在数组sum[i][j]中存储下标从1-i,1-j的矩形的面积,然后枚举边长,和左上角的点统计就行了。
/* ID: modengd1 PROG: range LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> using namespace std; int sum[251][251]; int N; int ans[251]; int main() { freopen("range.in","r",stdin); freopen("range.out","w",stdout); char ch; scanf("%d",&N); getchar(); memset(sum,0,sizeof(sum)); memset(ans,0,sizeof(ans)); for(int i=1;i<=N;i++) { for(int j=1;j<=N;j++) { scanf("%c",&ch); sum[i][j]=sum[i-1][j]+sum[i][j-1]+(int)(ch-‘0‘)-sum[i-1][j-1]; } getchar(); } for(int k=2;k<=N;k++) { for(int i=1;i<=N-k+1;i++) { for(int j=1;j<=N-k+1;j++) { int area1=sum[i+k-1][j+k-1]; int area2=sum[i+k-1][j-1]; int area3=sum[i-1][j+k-1]; int area4=sum[i-1][j-1]; int area5=area1-area2-area3+area4; if(area5==k*k) ans[k]++; } } } for(int i=2;i<=N;i++) { if(ans[i]!=0) cout<<i<<‘ ‘<<ans[i]<<endl; } return 0; }
时间: 2024-10-13 22:29:27