首页 > 其他分享 >闭合区域面积统计 题解

闭合区域面积统计 题解

时间:2023-12-22 19:22:06浏览次数:32  
标签:10 20 vis int 题解 闭合 nx ny 区域

题目描述

计算一个 \(10 \times 10\) 矩阵中由 \(1\) 围成的图形的面积。如下所示,在 \(10 \times 10\) 的二维数组中,\(1\) 围住了 \(15\) 个点,因此面积为 \(15\)。

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\) 围成的圈子)外的一个地方倒,再统计没有倒上的面积就可以了?

但是有一种例外,比如:

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

如上,如果我们只在左上角流水,那么水就会被堵住,不能流遍该流到的地方,答案就错了。

这时有两种解决方法:

  1. 在四角都流一遍水。

  2. 在地图的外圈添加一圈 \(0\),使得所有 \(0\) 都是联通的。

代码(四边加0法)

#include <bits/stdc++.h>
using namespace std;
bool a[20][20];
struct Node {
    int x, y;
};
queue<Node> q;
bool vis[20][20];
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int main() {
    for (int i = 2; i <= 11; i++) 
        for (int j = 2; j <= 11; j++) 
            cin >> a[i][j];
    q.push({1, 1});
    vis[1][1] = 1;
    a[1][1] = 1;
    while (!q.empty()) {
        Node t = q.front();
        q.pop();
        if (t.x == 12 and t.y == 12) break;
        for (int i = 0; i < 4; i++) {
            int nx = t.x + dx[i], ny = t.y + dy[i];
            if (nx > 12 or nx < 1 or ny > 12 or ny < 1) continue;
            if (vis[nx][ny]) continue;
            if (a[nx][ny]) continue;
            a[nx][ny] = vis[nx][ny] = 1;
            q.push({nx, ny});
        }
    }
    int cnt = 0;
    for (int i = 1; i <= 12; i++) 
        for (int j = 1; j <= 12; j++) 
            if (!a[i][j]) 
                cnt++;
    cout << cnt << '\n';
    return 0;
}

标签:10,20,vis,int,题解,闭合,nx,ny,区域
From: https://www.cnblogs.com/popfront/p/17922240.html

相关文章

  • CF1881F Minimum Maximum Distance 题解
    因为白点对\(f_i\)没有贡献,所以可以重构出一棵原树的子树,使得所有的叶子都为标记点且标记点数量不变(没有删去标记点)。因为没有标记被删去且结构不变,所以这棵树的答案与原树答案相同。现在,对于所有节点,到它距离最大的标记点一定在叶子上。那么问题就变为:求出树上任意一点到所有......
  • ISCTF2023部分题解
    WEB:圣杯战争!!!(题解:结局别说遗憾Zn.)解题思路:打开题目链接,代码如下:<?phphighlight_file(__FILE__);error_reporting(0);classartifact{public$excalibuer;public$arrow;publicfunction__toString(){echo"为Saber选择了对的武器!<br>";return$this->excal......
  • pageoffice6 实现提取数据区域为子文件(Word拆分)
    在实际的开发过程中,有时会遇到希望提取Word文档中部分内容保存为子文件的需求,PageOffice支持提取Word文档数据区域中的内容为一个Word文件流,在服务器端创建PageOffice的WordReader命名空间中的WordDocument对象并获取到DataRegion对象,再调用DataRegion对象的FileBytes属性就可以得......
  • 243-layui 区域树xmSelect懒加载,且叶子节点有选择时,自动追溯父节点,并展开选中
    varregionData=[]; varurl=ctx+'/base/region/queryByAll'; varrtnRegion=admin.syncReq(url,{parentId:0}); regionData=rtnRegion.data; active.renderRegionData(regionData,regionId); varregionSel=xmSelect.render({ el:'#r......
  • wps js在指定区域查找关键字
    Workbooks.Item(sy112).Activate();//“关键字”所在的文件letrng=Rows.Item("3:4");//“关键字”所在行letc=rng.Find("关键字",undefined,xlValues);if(c!=null){ letfirstCol=c.Column;//将第1个获取的列号赋值给变量firstCol do{arr.push(c.Column);//将列号存入列表......
  • 【洛谷 P1093】[NOIP2007 普及组] 奖学金 题解(结构体排序)
    [NOIP2007普及组]奖学金题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前名学生发奖学金。期末,每个学生都有门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规......
  • [CF17E] Palisection 题解
    [CF17E]Palisection题解思路直接统计相交的字符串很难数,考虑正难则反。用总共的回文串对数减去相离的回文串个数。设总共有\(tot\)个回文串,用manacher跑出来每个位置的最大回文半径后,使用差分的技巧保存两个数组:\(f_i\)表示以\(i\)为开头的回文串个数,\(g_i\)表示以......
  • CF187A 题解
    原题传送门题目大意如题意翻译。思路分析很水的一道题目,可以将第一个排列\(a\)看作最终排列,接下来每输入一个数,让它与\(a_m\)进行比较,直到两个排列相同。最后看题目范围,\(1≤n≤2\times10^5\),时间复杂度\(\mathcal{O(n)}\),空间复杂度\(\mathcal{O(n)}\)。代码:/*Writ......
  • CF1912L 题解
    原题传送门题目大意有一个仅有0和L构成的序列,求出一种方案,使得左部分的0数量不等于右部分的O数量,且左部分的L数量不等于右部分的L数量,若不存在输出-1。思路分析首先看题目范围,\(2≤n≤200\),数据很小,考虑暴力。可以使用字符串截取函数s.substr()。本题我们使......
  • 2. 运行时数据区域
    运行时数据区域JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域JDK1.7JDK1.81.程序计数器(ProgramCounterRegister)程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器字节码解释器工作时就是通过改变这个计......