题目描述
编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示,在10*10的二维数组中,有“*”围住了15个点,因此面积为15。
图形面积
输入
输入0-1矩阵(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
样例输出
15
解题思路
给图形四周围上一圈由-1;判断每个0的四周(上下左右)是否存在-1,若存在-1,把0变为为-1。最后只要计算0的个数就行了。
如下图
-1-1-1-1-1-1-1-1-1-1-1-1
-1 0 0 0 0 0 0 0 0 0 0-1
-1 0 0 0 0 1 1 1 0 0 0-1
-1 0 0 0 0 1 0 0 1 0 0-1
-1 0 0 0 0 0 1 0 0 1 0-1
-1 0 0 1 0 0 0 1 0 1 0-1
-1 0 1 0 1 0 1 0 0 1 0-1
-1 0 1 0 0 1 1 0 1 1 0-1
-1 0 0 1 0 0 0 0 1 0 0-1
-1 0 0 0 1 1 1 1 1 0 0-1
-1 0 0 0 0 0 0 0 0 0 0-1
-1-1-1-1-1-1-1-1-1-1-1-1
代码如下:
#include<iostream>
#include<string>
using namespace std;
int pan[12][12];
int main()
{
int sum=0;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
pan[i][j]=0;
for(int i=0;i<12;i++)
{
pan[i][0]=-1;
pan[0][i]=-1;
pan[i][11]=-1;
pan[11][i]=-1;
}
for(int i=1;i<11;i++)
for(int j=1;j<11;j++)
{
cin>>pan[i][j];
}
for(int i=1;i<11;i++)
for(int j=1;j<11;j++)
{
if(pan[i][j]==0&&pan[i-1][j]==-1)
pan[i][j]=-1;
if(pan[i][j]==0&&pan[i][j-1]==-1)
pan[i][j]=-1;
if(pan[i][j]==0&&pan[i+1][j]==-1)
pan[i][j]=-1;
if(pan[i][j]==0&&pan[i][j+1]==-1)
pan[i][j]=-1;
}
for(int j=1;j<11;j++)
for(int i=1;i<11;i++)
{
if(pan[i][j]==0&&pan[i-1][j]==-1)
pan[i][j]=-1;
if(pan[i][j]==0&&pan[i][j-1]==-1)
pan[i][j]=-1;
if(pan[i][j]==0&&pan[i+1][j]==-1)
pan[i][j]=-1;
if(pan[i][j]==0&&pan[i][j+1]==-1)
pan[i][j]=-1;
}
for(int i=1;i<11;i++)
for(int j=1;j<11;j++)
{
if(pan[i][j]==0)
sum++;
}
cout<<sum;
}