http://acm.hdu.edu.cn/showproblem.php?pid=4331
O(n^3),加了特判
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
#include <cmath>
#include <string>
#define N 1005
using namespace std;
int n,a[N][N],vert[N][N],hori[N][N],r[N][N],d[N][N];
bool find(int i,int j,int l)
{
int t1=vert[i][j+l]-vert[i][j]+1;
int t2=hori[i+l][j+l]-hori[i][j+l]+1;
int t3=vert[i+l][j+l]-vert[i+l][j]+1;
int t4=hori[i+l][j]-hori[i][j]+1;
//cout<<t1<<' '<<t2<<' '<<t3<<' '<<t4<<endl;
if (t1==l+1 && t2==l+1 && t3==l+1 && t4==l+1) return true;
else return false;
}
int main()
{
int t;
scanf("%d",&t);
for (int cas=1;cas<=t;cas++)
{
bool ju=true;
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
if (a[i][j]!=1) ju=false;
}
int ans=0;
memset(hori,0,sizeof(hori));
memset(vert,0,sizeof(vert));
memset(r,0,sizeof(r));
memset(d,0,sizeof(d));
for (int i=n;i>=1;i--)
for (int j=n;j>=1;j--)
{
if (a[i][j])
{
r[i][j]=r[i][j+1]+1;
d[i][j]=d[i+1][j]+1;
}
else
{
r[i][j]=0;
d[i][j]=0;
}
}
if (a[1][1]) hori[1][1]=vert[1][1]=1;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
if (a[i][j])
{
hori[i][j]=hori[i-1][j]+1;
vert[i][j]=vert[i][j-1]+1;
}
else
{
hori[i][j]=hori[i-1][j];
vert[i][j]=vert[i][j-1];
}
}
/*for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
cout<<hori[i][j]<<' ';
cout<<endl;
}*/
int sum=0;
for (int i=1;i<=n;i++)
sum+=i*i;
if (ju) {printf("Case %d: %d\n",cas,sum);continue;}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
if (a[i][j])
for (int k=0;k<min(r[i][j],d[i][j]) && (i+k<=n) && (j+k<=n);k++)
if (a[i][j+k] && a[i+k][j+k] && a[i+k][j])
if ( find(i,j,k) ) ans++;
}
printf("Case %d: %d\n",cas,ans);
}
return 0;
}