#T1359. 围成面积

题目描述

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

输入

10×10的图形。

输出

输出面积。

样例

输入数据 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

输出数据 1

复制代码
15

来源

一本通在线评测

围成面积问题思路

问题分析:

计算由''字符围成的闭合区域面积,实际是统计被''包围的空白点数量。

核心思路:​​洪水填充法(Flood Fill)​​

从边界开始向外扩散,标记所有能够到达的空白点,剩下的未被标记的空白点就是被包围的区域。

具体步骤:
    1. ​​预处理​​:
    • •将输入数据存储在10×10的字符矩阵中
    • •在矩阵外围添加一圈空白(作为边界起点)
    1. ​​边界洪水填充​​:
    • •从四个角点开始进行BFS/DFS遍历
    • •将所有与边界连通的空白点标记为已访问
    1. ​​统计内部空白点​​:
    • •遍历整个矩阵(不包括外围添加的边界)
    • •统计未被标记的空白点数量(这些就是被'*'包围的区域)
    1. ​​输出结果​​:
    • •内部空白点数量即为所求面积
算法选择:
  • •​BFS(广度优先搜索)​:更适合矩阵遍历,避免递归深度问题
  • •​方向处理​:四个方向(上、下、左、右)移动
关键点:
  1. 1.​外围扩展​:在10×10矩阵外添加一圈,确保能从边界开始填充
  2. 2.​标记机制​:使用visited数组记录可达点
  3. 3.​边界条件​ :只处理空白点(非''字符),遇到''则停止扩散
复杂度分析:
  • •时间复杂度:O(n²) = O(100)
  • •空间复杂度:O(n²) = O(100)
示例验证:

对于样例输入,通过洪水填充后,内部未被标记的空白点正好是15个,与题目描述一致。

这种方法能够准确识别闭合区域,适用于各种形状的包围情况。

代码样例

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

char mp[12][12];
bool vis[12][12];
int dx[]= {0,0,1,-1};
int dy[]= {1,-1,0,0};

void dfs(int x,int y)
{
	if(x<0 || x>11 || y<0 || y>11)
	{
		return;
	}
	if(vis[x][y] || mp[x][y]=='1')
	{
		return;
	}
	vis[x][y]=1;
	for(int i=0; i<4; i++)
	{
		dfs(x+dx[i],y+dy[i]);
	}
}

int main()
{

	for(int i=0; i<12; i++)
	{
		for(int j=0; j<12; j++)
		{
			mp[i][j]='0';
		}
	}

	for(int i=1; i<=10; i++)
	{
		for(int j=1; j<=10; j++)
		{
			cin>>mp[i][j];
		}
	}

	dfs(0,0);
	int cnt=0;

	for(int i=1; i<=10; i++)
	{
		for(int j=1; j<=10; j++)
		{
			if(!vis[i][j] && mp[i][j]=='0')
			{
				cnt++;
			}
		}
	}

	cout<<cnt;
	return 0;
}

此代码仅供参考,请勿纯抄

相关推荐
凤凰院凶涛QAQ21 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
Codiggerworld1 天前
从“装一套协议”到“扔进终端”:MCP 与 CLI 的 Agent 工具层之争
人工智能·程序人生·ai编程
w_zero_one1 天前
算法--模拟
java·数据结构·算法
秋天的怀念_David1 天前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
·present·1 天前
CSAPP(lecture 4_01)
c语言·c++
FPGA小迷弟1 天前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
c++·python·ai·plotly·django·ai编程·claude
秋天的怀念_David1 天前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪1 天前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
程序员-King.1 天前
【ROS1】Noetic 开发工作流程与常用命令
c++·ubuntu·ros
云深麋鹿1 天前
C++ | 基于红黑树实现mymap与myset
开发语言·c++