#include<stdio.h>
#include<string.h>
int n,arr[108][108];
long long ans;
int list1[6],list2[6];
int x11[5]={ 0,-1,1,1,-1},y11[5]={0,-1,-1,1,1};//四个方向,左上,右上,右下,左下,前面的0没有用
bool judge(int x){
return x>=1&&x<=n;
}
void seach1(){
int flag=1;
if(list1[0]<4)return ;
for(int i=1;i<=4;i++){
int x=list1[i]/1000,y=list1[i]%1000;
//printf("%d %d\n",x,y);
if(judge(x+x11[i])&&judge(y+y11[i])&&arr[x+x11[i]][y+y11[i]]==1){
list2[++list2[0]]=(x+x11[i])*1000+y+y11[i];
}
else{
list2[0]=0;
return;
}
}
if(flag){
ans++;
memcpy(list1,list2,sizeof(list2));
list2[0]=0;
seach1();
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
char str[108];
scanf("%s",str+1);
for(int j=1;j<=n;j++){
arr[i][j]=str[j]-'0';
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(arr[i][j]==1){
if(arr[i][j+1]==1&&arr[i+1][j]==1&&arr[i+1][j+1]==1){//当为X中心为2*2的‘1’的时候
list1[0]=4;
list1[1]=i*1000+j,list1[2]=i*1000+j+1,list1[3]=(i+1)*1000+j+1,list1[4]=(i+1)*1000+j;
ans++;
seach1();
}
list1[0]=4;//一般情况,X长度为奇数的时候
list1[1]=list1[2]=list1[3]=list1[4]=i*1000+j;
seach1();
//printf("%d %d %d\n",i,j,ans);
}
}
}
printf("%lld",ans);
return 0;
}
比赛上直接炸了,还自信不回头www,实在找不到hack,求大佬帮帮忙!