闭合区域面积统计

闭合区域面积统计(area

题目描述

编程计算由‘*’号围成的下列图形的面积。面积的计算方法是统计*号所围成

的闭合曲线中水平线和垂直线交点的数目。如图所示,在10*10 的二维数组中,

有*围住了15 个点,因此面积为15。

0 0 0 0 0 0 0 0 0 0

0 0 0 0 * * * 0 0 0

0 0 0 0 * 0 0 * 0 0

0 0 0 0 0 * 0 0 * 0

0 0 * 0 0 0 * 0 * 0

0 * 0 * 0 * 0 0 * 0

0 * 0 0 * * 0 * * 0

0 0 * 0 0 0 0 * 0 0

0 0 0 * * * * * 0 0

0 0 0 0 0 0 0 0 0 0

输入

一个10*10 的二维数组, 里面的数为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

****看起来应该不会所以直接输出样例。

#include<cstdio>

#include<cstring>

int sum=0;

int a[15][15];

void dfs(int x,int y)

{

  if(x>11||y>11||x<0||y<0)return;   //如果过了这个图的边界就返回

  if(a[x][y])return;  //如果碰到了*边界那说明前面的这些都是不要的返回

  if(a[x][y]==2){   //如果碰到已经计完数的点

    dfs(x+1,y);    //就在有限的图里面上下左右的继续搜索

    dfs(x,y+1);

    if(x!=0)

    dfs(x-1,y);

    if(y!=0)

    dfs(x,y-1);

    return;

  }

  sum++;    //不被围起来的点计数

  a[x][y]=2;  //把这些点标记已计数

  dfs(x+1,y);  

  dfs(x,y+1);//在有限的图里面上下左右的继续搜索

  if(x!=0)

  dfs(x-1,y);

  if(y!=0)

  dfs(x,y-1);

  return;

}

int main()

{

  freopen("area.in","r",stdin),freopen("area.out","w",stdout);

  memset(a,0,sizeof(a));

  for(int i=1;i<=10;i++){

    for(int j=1;j<=10;j++){

      scanf("%1d",&a[j][i]);     //输入图形

      if(a[j][i]==1)sum++;      //所有的不可能被围住的*数量

    }

  }

  dfs(0,0);

  printf("%d",144-sum);//当初算的时候是吧整个图扩大了,所以用整个图减去不被围住的就是被围住的点

  return 0;

}

 

****这道题呢就是和这个图差不多。要求的是在黄色里面搜索围起来的面积,围起来的面积不好求,那就换一个角度思考问题,可以考虑用所有点减去不被围起来的面积,考虑到边界的问题,就把整个图扩大,长宽各扩大一导致成为一个12*12的正方形,然后搜索所有不被围起来的点用144减去就能得到正解。

原文地址:https://www.cnblogs.com/rax-/p/8719902.html