问题描述
编程计算由“1”围成的下列图形的面积。面积计算方法是统计"1"所围成的闭合曲线中水平线和垂直线交点的数目。如右下图所示,在10*10的二维数组中,有“1”围住了15个点,因此面积为15。
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 1 0
0 0 1 0 0 0 1 0 1 0
0 1 0 1 0 1 0 0 1 0
0 1 0 0 1 1 0 1 1 0
0 0 1 0 0 0 0 1 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
输入格式
由数字0和1构成的一个10*10的矩阵
输出格式
一个整数,表示所求面积
样例输入
样例输入1:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 1 0
0 0 1 0 0 0 1 0 1 0
0 1 0 1 0 1 0 0 1 0
0 1 0 0 1 1 0 1 1 0
0 0 1 0 0 0 0 1 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
样例输入2:
0 1 1 1 1 1 1 1 1 0
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
0 1 1 1 1 1 1 1 1 0
样例输出
样例输出1:
15
样例输出2:
64
#include<bits/stdc++.h>
using namespace std;
int Map[15][15];
int nk[5]={0,0,1,-1},ny[5]={1,-1,0,0},num;
queue <int> x,y;
void bfs(int a,int b)
{
x.push(a);
y.push(b);
while(x.empty()==0)
{
for(int i=0;i<=4;i++)
{
if(x.front()+nk[i]<=11&&x.front()+nk[i]>=0&&y.front()+ny[i]<=11&&y.front()+ny[i]>=0&&Map[x.front()+nk[i]][y.front()+ny[i]]==0)
{
x.push(x.front()+nk[i]);
y.push(y.front()+ny[i]);
Map[x.front()+nk[i]][y.front()+ny[i]]=1;
}
}
x.pop();
y.pop();
}
}
int main()
{
for(int i = 1; i <= 10; i++)
{
for(int j = 1; j <= 10; j++)
cin>>Map[i][j];
}
bfs(0,0);
for(int i=1;i<=11;i++)
for(int j=1;j<=11;j++)
if(Map[i][j]==0)
num++;
cout<<num;
return 0;
}