题意
给定一个只由0和1组成的n阶矩阵,问在其中有多少个正方形满足四个边上都是1
思路
对于每个位置统计它左边和上边有多少个连续的1(包括它本身),然后暴力枚举每一位作为右下角可能的边长进行判断,统计结果
代码
#include <cstdio>
#include <algorithm>
using namespace std;
int up[1001][1001],left[1001][1001];
int image[1001][1001];
int main()
{
int T,N,e,ans,kase;
scanf("%d",&T);
for(int kase=1;kase<=T;kase++)
{
scanf("%d",&N);
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
{
scanf("%d",&image[i][j]);
if(image[i][j])
{
up[i][j]=up[i-1][j]+1;
left[i][j]=left[i][j-1]+1;
}
else
{
up[i][j]=0;
left[i][j]=0;
}
}
ans=0;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
{
e=min(up[i][j],left[i][j]);
for(int k=1;k<=e;k++)
ans+=min(up[i][j-k+1],left[i-k+1][j])>=k;
}
printf("Case %d: %d\n",kase,ans);
}
return 0;
}