【题解】面积(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

输入格式

一个矩阵。

输出格式

面积

样例

样例输入

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’)围起来的地,现在我们在墙外倒水(假设水无限多),一段时间后,没被水淹的部分的面积即为所求;

现在我们模拟倒水的过程即可:

1.在哪倒水?

有人会说在 左上角/左下角/右上角/右下角 倒水,但这都不好,因为如果这样,水就有可能倒到墙上QAQ

所以我们不妨在这块地的周围再加一圈‘0’,然后在新地的 左上角/左下角/右上角/右下角 倒水,至于你要真想在新地的一个对你有特殊意义的地方倒水比如…250,我也无话可说,但要注意一定要在新加的一圈地上倒,否则就白搭。

2.水不能流遍该流的地方怎么办

我知道,你们是在担心这种毒瘤数据:

0 0 0 1 0 0 0 0 0 0
0 0 1 0 1 0 0 0 0 0
0 0 1 0 0 1 0 0 0 0
0 1 0 0 0 1 0 0 0 0
1 0 0 0 0 0 1 0 0 0
0 1 1 1 1 1 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

如果这样你还选择在左上角倒水,水就只会被堵在左上角一块,统计的时候就GG了,还是刚才那招,在这块地的周围加一圈‘0’,这样新加的一圈就起到了连通的作用,

代码实现大致思路

1.首先你需要在这块地的周围加一圈‘0’

2.然后你需要一个BFS/DFS函数,用来模拟流水过程

3.最后统计没被水淹的部分,完成!!!

代码

#include<cstdio>
#include<iostream>
using namespace std;
int arr[15][15];
void bfs(int i,int j){
	bool flag=false;
	if(i-1>=0 && arr[i-1][j]==0){
		arr[i-1][j]=1;
		bfs(i-1,j);
		flag=true;
	}
	if(i+1<=11 && arr[i+1][j]==0){
		arr[i+1][j]=1;
		bfs(i+1,j);
		flag=true;
	}
	if(j-1>=0 && arr[i][j-1]==0){
		arr[i][j-1]=1;
		bfs(i,j-1);
		flag=true;
	}
	if(j+1<=11 && arr[i][j+1]==0){
		arr[i][j+1]=1;
		bfs(i,j+1);
		flag=true;
	}
	if(flag==false){
		return;
	}
}
int main(){
	for(int i=0;i<=15;i++){
		arr[i][0]=0;
		arr[i][11]=0;
	}
	for(int j=0;j<=15;j++){
		arr[0][j]=0;
		arr[11][j]=0;
	}
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			scanf("%d",&arr[i][j]);
		}
	}
	bfs(0,0);
	int ans=0;
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			if(arr[i][j]==0){
				ans++;
			}
		}
	}
	printf("%d",ans);
return 0;
} 

猜你喜欢

转载自blog.csdn.net/tanfuwen_/article/details/106819609