hdu 2483 Counting square

http://acm.hdu.edu.cn/showproblem.php?pid=2483

需要对矩阵进行预处理来降低复杂度。

代码如下:

#include"stdio.h"
#include"string.h"

int a[305][305],vis1[305][305],vis2[305][305];
int sum[305][305];


int main( )
{
    int i,j,r,c,t,count,k,s;
    scanf("%d",&t);
    while(t--)
    {
        count=0;
        scanf("%d%d",&r,&c);
        memset(vis1,0,sizeof(vis1));
        memset(vis2,0,sizeof(vis2));
        memset(sum,0,sizeof(sum));
        for(i=1;i<=r;i++)
            for(j=1;j<=c;j++)//对该矩阵进行预处理;
            {
                scanf("%d",&a[i][j]);
                if(a[i][j]==1)
                {vis1[i][j]=vis1[i-1][j]+1;vis2[i][j]=vis2[i][j-1]+1;}//vis1[i][j]存放第i行第j个元素及其以上该列中所含的1的个数;
                else
                {vis1[i][j]=vis1[i-1][j];vis2[i][j]=vis2[i][j-1];}
                sum[i][j]=sum[i-1][j]+vis2[i][j];//sum中存放该元素到首元素所形成矩形中1的个数;
            }
        for(i=1;i<=r;i++)
            for(j=1;j<=c;j++)
            {
                if(a[i][j]==0)
                    continue;
                for(k=1;i+k<=r&&j+k<=c;k++)
                {
                    if(a[i+k][j+k]==0)
                        continue;
                    if(vis1[i+k][j]-vis1[i][j]!=k||vis1[i+k][j+k]-vis1[i][j+k]!=k||vis2[i][j+k]-vis2[i][j]!=k||vis2[i+k][j+k]-vis2[i+k][j]!=k)
                        continue;
                    s=sum[i+k-1][j+k-1]-sum[i+k-1][j]-sum[i][j+k-1]+sum[i][j];
                    if((k-1)*(k-1)-2*s>=-1&&(k-1)*(k-1)-2*s<=1)
                        count++;
                }
            }
        printf("%d\n",count);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/chaosheng/p/2521319.html