您的位置:首页 > 其它

28.广搜:被围住的面积

2016-02-29 19:15 267 查看
编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示,在10*10的二维数组中,有“*”围住了15个点,因此面积为15。


【样例输入】
area.in

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


【样例输出】
area.out

15





思路:因为边界一定不会被围住,先把边界的0都设为2,开始广搜,如果一个0上下左右位置有一个是2的话,那么这个0一定不会被围住,就赋值为2,最后再统计有多少个0就可以了

代码:

#include

using namespace std;

#include

#define maxn 101

int p[maxn][maxn];

int n;

int main()

{

n=10;

for(int i=1;i<=n;++i)

for(int j=1;j<=n;++j)

{

scanf("%d",&p[i][j]);

if((i==1||i==n)&&p[i][j]==0) p[i][j]=2;

if((j==1||j==n)&&p[i][j]==0) p[i][j]=2;

}

for(int i=2,i1=n-1;i

for(int j=2;j<=n-1;++j)

{

if(p[i][j]==0)

{

if(p[i+1][j]==2||p[i-1][j]==2||p[i][j+1]==2||p[i][j-1]==2)

p[i][j]=2;

}

if(p[i1][j]==0)

{

if(p[i1+1][j]==2||p[i1-1][j]==2||p[i1][j+1]==2||p[i1][j-1]==2)

p[i1][j]=2;

}

}

int sum=0;

for(int i=1;i<=n;++i)

for(int j=1;j<=n;++j)

{

if(p[i][j]==0)

sum++;

}

printf("%d",sum);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: