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