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;

}

你可能感兴趣的:(count)