闭合区域面积统计(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减去就能得到正解。