面积(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

思路

先将原n*m矩阵的n-1与n+1行,m-1与m+1列全部赋值为2,进行DFS,是要当前元素是0且其上下左右存在一个及以上的2,将该元素改为2.

最后循环n*m矩阵剩余0的数量,即为最终所求答案。

总的来说,就是这种巧妙应对的方式,跟暴枚时间复杂度差不多,不过也不至于TLE

c++AC代码

#include<bits/stdc++.h>
using namespace std;
char a[105][105];
int ans;
inline void dfs(int i,int j){
	if(a[i][j-1]=='2'||a[i][j+1]=='2'||a[i-1][j]=='2'||a[i+1][j]=='2'){
		a[i][j]='2';
		if(a[i][j-1]!='1')a[i][j-1]='2';
		if(a[i][j+1]!='1')a[i][j+1]='2';
		if(a[i-1][j]!='1')a[i-1][j]='2';
		if(a[i+1][j]!='1')a[i+1][j]=='2';
	}
} 
int main(){
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			cin>>a[i][j];
		}
	}
	for(int i=0;i<=11;i++)a[0][i]='2',a[i][0]='2',a[i][11]='2',a[11][i]='2';
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			if(a[i][j]!='1')dfs(i,j);
		}
	}
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			if(a[i][j]=='0')ans++;
		}
	}
	cout<<ans;
	return 0;
} 
posted @ 2021-02-26 21:56  黄逸飞重庆八中  阅读(195)  评论(0编辑  收藏  举报