题目要求:
小岛面积
1 1 1 1 1 1
1 1 0 0 0 1
1 0 0 0 1 0
1 1 0 1 1 1
0 1 0 1 0 0
1 1 1 1 1 1
上面矩阵的中的1代表海岸线,0代表小岛。求小岛面积(即被1中包围的0的个数)。注意:仅求这样的0,该0所在行中被两个1包围,该0所在列中被两个1包围。
输入:
第一行输入一个整数N,表示输入方阵的维数
输入一个N维方阵
输出:
小岛面积
样例输入:
6
1 1 1 1 1 1
1 1 0 0 0 1
1 0 0 0 1 0
1 1 0 1 1 1
0 1 0 1 0 0
1 1 1 1 1 1
样例输出:
8
说明:本人采用的VS2013编写,不知道什么原因需要添加#pragma warning(disable:4996)才可以使用scanf语句。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
int row[100][2];
int col[100][2];
memset(row, -1, sizeof(row));
memset(col, -1, sizeof(col));
int n;
scanf("%d", &n);
int *p = (int*)calloc(n*n, sizeof(int));
if (p == NULL)
{
exit(1);
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &p[n*i + j]);
if (p[i*n + j] == 1)
{
if (row[i][0] == -1)
{
row[i][0] = j;
}
if (col[j][0] == -1)
{
col[j][0] = i;
}
row[i][1] = j;
col[j][1] = i;
}
}
}
int num = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
if (p[i*n + j] == 0)
{
if (j>row[i][0] && j<row[i][1] && i>col[j][0] && i < col[j][1])
{
num++;
}
}
}
free(p);
printf("%d",num);
getchar();
getchar();
getchar();
getchar();
return 0;
}