#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
struct node
{
int lmark,rmark,umark,dmark;//矩阵中每个数它的上下左右有没有1的标记 有则1 无则0 初始位0
int value;//矩阵中的数字 0或者1
}m[1000][1000];//结构体类型的矩阵
int main()
{
int N;
while(scanf("%d",&N)!=EOF)
{
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
scanf("%d",&m[i][j].value);//输入
m[i][j].lmark=0;//初始化左右上下标记位
m[i][j].rmark=0;
m[i][j].umark=0;
m[i][j].dmark=0;
}
}
int k,sum=0;//sum是小岛面积,k用于比较循环
for(i=1;i<N-1;i++)
{
for(j=1;j<N-1;j++)
{
if(m[i][j].value==0)//若是小岛部分不是海岸线则看是否有上下左右标记即海岸线
{
for(k=0;k<j;k++)//左海岸线
{
if(m[i][k].value==1)
{
m[i][j].lmark=1;
// m[i][j].rmark=1;
// m[i][j].umark=1;
// m[i][j].dmark=1;
}
}
for(k=j+1;k<N;k++)//右海岸线
{
if(m[i][k].value==1)
{
// m[i][j].lmark=1;
m[i][j].rmark=1;
// m[i][j].umark=1;
// m[i][j].dmark=1;
}
}
for(k=0;k<i;k++)//上海岸线
{
if(m[k][j].value==1)
{
// m[i][j].lmark=1;
// m[i][j].rmark=1;
m[i][j].umark=1;
// m[i][j].dmark=1;
}
}
for(k=i+1;k<N;k++)//下海岸线
{
if(m[k][j].value==1)
{
// m[i][j].lmark=1;
// m[i][j].rmark=1;
// m[i][j].umark=1;
m[i][j].dmark=1;
}
}
//若上下左右都有海岸线 则算入小岛面积
if(m[i][j].lmark&&m[i][j].rmark&&m[i][j].umark&&m[i][j].dmark)
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}
输出//只测试了样例 可能存在未知bug