9-5 E. DS图—图非0面积

news/2024/11/29 13:40:55/

题目描述

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

提示:queue

输入

测试次数t

每组测试数据格式为:

数组大小m,n

一个由0和1组成的m*n的二维数组

输入样例:

2
10 10
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
5 8
0 1 1 0 0 1 1 0
1 0 1 0 1 0 0 1
0 1 0 1 0 0 1 0
0 1 0 0 1 1 1 0
0 0 0 0 0 0 0 0

输出

对每个二维数组,输出符号"1"围住的"0"的个数,即围成的面积。假设一定有1组成的闭合曲线,但不唯一。

输出样例:

15
5

代码

#include <iostream>
#include <queue>
using namespace std;class List{
public:int m,n;int **matrix,**flag;  //matrix矩阵, flag标志是否入过队List(){cin >> m >> n;matrix = new int*[m+2];  //将原本的矩阵周围新增一圈行列,防止路径被边缘的1堵死flag = new int*[m+2];for(int i = 0; i < m+2; i++){matrix[i] = new int[n+2];flag[i] = new int[n+2];for(int j = 0; j < n+2; j++){if(i == 0 || i == m+1 || j == 0 || j == n+1){matrix[i][j] = 0;  //边缘一圈的赋值0}else{cin >> matrix[i][j];}flag[i][j] = 0;  //初始化}}}void BFS(){  //用广度优先搜索遍历矩阵中不被包围的0,将其改为1,即将矩阵中所有不被1包围的0改成1queue<int> queX,queY;  //queX存储横坐标,queY存储纵坐标int x,y;queX.push(0);queY.push(0);flag[0][0] = 1;while(!queX.empty()){  //即队列非空时x = queX.front();y = queY.front();matrix[x][y] = 1;queX.pop();queY.pop();if(x+1 < m+2){  //对当前队首元素构成的坐标按照上下左右的顺序广度搜索if(matrix[x+1][y] == 0 && flag[x+1][y] == 0){  //此句一定要和上面的if分开queX.push(x+1);queY.push(y);flag[x+1][y] = 1;}}if(x-1 >= 0){if(matrix[x-1][y] == 0 && flag[x-1][y] == 0){queX.push(x-1);queY.push(y);flag[x-1][y] = 1;}}if(y+1 < n+2){if(matrix[x][y+1] == 0 && flag[x][y+1] == 0){queX.push(x);queY.push(y+1);flag[x][y+1] = 1;}}if(y-1 >= 0){if(matrix[x][y-1] == 0 && flag[x][y-1] == 0){queX.push(x);queY.push(y-1);flag[x][y-1] = 1;}}}}int getRes(){  //遍历矩阵,累加为0的元素个数int sum=0;for(int i = 1; i < m+1; i++){for(int j = 1; j < n+1; j++){if(matrix[i][j] == 0){sum++;}}}return sum;}
};int main()
{int t,res;cin >> t;while(t--){List list;list.BFS();res = list.getRes();cout << res << endl;}return 0;
}

http://www.ppmy.cn/news/1360235.html

相关文章

PostgreSQL与MySQL,谁更胜一筹

前言 PostgreSQL与MySQL都是优秀的开源数据库。在日常学习中&#xff0c;新手可能接触最多的是MySql,但是实际工作中&#xff0c;两者的应用场景其实都很广。我之前的做过上网流量销售业务&#xff0c;用的是MySQL,现在接触广告业务&#xff0c;用的是pg数据库&#xff0c;每天…

计算任意两个日期之间天数 Matlab

tdatetime(today);%get今天日期t12002-04-01;mdatenum(t1-t1) %做差后是hour,转化为天数参考 matlab日期函数

寒假学习总结

目录 一、引言 寒假时间学习大致进度 二、学习内容概述 三、学习成果与收获 学习成果具体展现&#xff1a; 1.深搜广搜 2.栈 3.队列 4.链表 5.动态规划 6.并查集 7.记忆化搜索 8.二叉树 9.图 10.堆 11.寒假部分收录完成题目&#xff08;少数没有收录&#xff09…

《剑指Offer》笔记题解思路技巧优化_Part_6

《剑指Offer》笔记&题解&思路&技巧&优化_Part_6 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题&#x1f7e1;1.LCR 168. 丑数—— 丑数&#x1f7e2;2. LCR 16…

信息学奥赛一本通1209:分数求和

1209&#xff1a;分数求和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 19111 通过数: 10647 【题目描述】 输入n个分数并对他们求和&#xff0c;并用最简形式表示。所谓最简形式是指&#xff1a;分子分母的最大公约数为11&#xff1b;若最终结果的分母为11&am…

力扣代码学习日记六

Problem: 66. 加一 思路 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1&#xff1a; 输…

线性代数:线性方程组解的结构

目录 齐次/非齐次方程组的解 Ax 0 的解的性质 定理 Ax b 的解的性质 相关证明 例1 例2 例3 齐次/非齐次方程组的解 Ax 0 的解的性质 定理 Ax b 的解的性质 相关证明 例1 例2 例3

力扣226 翻转二叉树 Java版本

文章目录 题目描述解题思路代码 题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root…