KamaCoder 101. 孤岛的总面积

news2024/9/21 22:45:43

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。

现在你需要计算所有孤岛的总面积,岛屿面积的计算方式为组成岛屿的陆地的总数。

输入描述

第一行包含两个整数 N, M,表示矩阵的行数和列数。之后 N 行,每行包含 M 个数字,数字为 1 或者 0。

输出描述

输出一个整数,表示所有孤岛的总面积,如果不存在孤岛,则输出 0。

在矩阵中心部分的岛屿,因为没有任何一个单元格接触到矩阵边缘,所以该岛屿属于孤岛,总面积为 1。

思路

本题要求找到不靠边的陆地面积,那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图 统计此时还剩下的陆地就可以了。

在遇到地图周边陆地的时候,将1都变为0,此时地图为这样:

代码

C++深度优先搜索(dfs负责记录孤岛大小并将贴边岛屿标记为海洋,可以一起用是因为在将所有贴边岛屿标记为海洋之前不会更新count)
#include<iostream>
#include<vector>
using namespace std;

int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};
int count;
void dfs(vector<vector<int>>& grid, int x, int y) {
    grid[x][y] = 0;
    count++;
    for (int i = 0; i < 4; ++i) {
        int nextx = x + dir[i][0];
        int nexty = y + dir[i][1];
        if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;
        if (grid[nextx][nexty] == 0) continue;
        dfs(grid, nextx, nexty);
    }
    return;
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> grid(n, vector<int>(m, 0));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> grid[i][j];
        }
    }
    // 从左侧边,和右侧边向中间遍历
    for (int i = 0; i < n; ++i) {
        if (grid[i][0] == 1) dfs(grid, i, 0);
        if (grid[i][m-1] == 1) dfs(grid, i, m-1);
    }
    // 从上边和下边,向中间遍历
    for (int j = 0; j < m; ++j) {
        if (grid[0][j] == 1) dfs(grid, 0, j);
        if (grid[n-1][j] == 1) dfs(grid, n-1, j);
    }
    // 已经把贴边的岛屿都标记为海洋了,重新开始记录陆地
    count = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (grid[i][j] == 1) {
                dfs(grid, i, j);
            }
        }
    }
    cout << count << endl;
}
C++广度优先搜索(注意将nextx, nexty加入队列时,立刻标记为0,避免之后重新加入)
#include<iostream>
#include<vector>
#include<queue>
using namespace std;

int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};
int count;
void bfs(vector<vector<int>>& grid, int x, int y) {
    queue<pair<int, int>> que;
    que.push({x, y});
    grid[x][y] = 0;
    count++;
    while(!que.empty()) {
        pair<int, int> cur = que.front(); que.pop();
        int curx = cur.first;
        int cury = cur.second;
        for (int i = 0; i < 4; ++i) {
            int nextx = curx + dir[i][0];
            int nexty = cury + dir[i][1];
            if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;
            if (grid[nextx][nexty] == 1) {
                que.push({nextx, nexty});
                count++;
                grid[nextx][nexty] = 0; // 只要加入队列立刻标记
            }
        }
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> grid(n, vector<int>(m, 0));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> grid[i][j];
        }
    }
    // 从左侧边,和右侧边向中间遍历
    for (int i = 0; i < n; ++i) {
        if (grid[i][0] == 1) bfs(grid, i, 0);
        if (grid[i][m-1] == 1) bfs(grid, i, m-1);
    }
    // 从上边和下边,向中间遍历
    for (int j = 0; j < m; ++j) {
        if (grid[0][j] == 1) bfs(grid, 0, j);
        if (grid[n-1][j] == 1) bfs(grid, n-1, j);
    }
    // 已经把贴边的岛屿都标记为海洋了,重新开始记录陆地
    count = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (grid[i][j] == 1) {
                bfs(grid, i, j);
            }
        }
    }
    cout << count << endl;
}
Python广度优先搜索
from collections import deque

n, m = list(map(int, input().strip().split()))
grid = [list(map(int, input().strip().split())) for _ in range(n)]

dirc = [[0, 1], [1, 0], [0, -1], [-1, 0]]
count = 0

def bfs(r, c):
    global count
    q = deque()
    q.append((r, c))
    grid[r][c] = 0
    count += 1
    
    while q:
        r, c = q.popleft()
        for dx, dy in dirc:
            nextr, nextc = r + dx, c + dy
            if (nextr < 0 or nextr >= n or nextc < 0 or nextc >= m):
                continue
            if grid[nextr][nextc] == 1:
                q.append((nextr, nextc))
                grid[nextr][nextc] = 0
                count += 1

for i in range(n):
    if grid[i][0] == 1: bfs(i, 0)
    if grid[i][m-1] == 1: bfs(i, m-1)
    
for j in range(m):
    if grid[0][j] == 1: bfs(0, j)
    if grid[n-1][j] == 1: bfs(n-1, j)

count = 0;
for i in range(n):
    for j in range(m):
        if grid[i][j] == 1: bfs(i, j)

print(count)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bugku -----Web-----全题目解析 (二) 超详细步骤

————————————————————分割线———————————————————— 6.矛盾 这一行从 URL 查询字符串中获取名为 num 的参数值&#xff0c;并将其赋值给 $num 变量。如果 URL 中没有提供 num 参数&#xff0c;或者参数值不是有效的字符串&#xff0c;则…

Modbus-RTU详解

目录 Modbus-RTU协议 帧结构示例 CRC16校验算法 CRC16算法的过程 modbus-rtu的使用 发送数据 接收数据 tcp网口完整实现modbus-rtu协议 使用NModbus4实现modbus-rtu协议 安装NModbus4库。 串口实现NModbus4 Modbus-RTU协议 Modbus RTU 协议是一种开放的串行协议&#xff0c;广…

基于51单片机的无线模块PWM电机调速设计

一、概述 为了实现对直流电机无极调速的需求&#xff0c;提出了一种基于STC 89C52微控制器的直流PWM可调速系统设计方案。根据系统所需达到的控制目的&#xff0c;UL2003驱动芯片作为电动机驱动电路&#xff0c;实现对电机的驱动。控制算法采用经典PWM脉宽调制算法作为控制策略…

充电宝哪个牌子好?学生党适合哪种充电宝?推荐四款性价比充电宝

对于学生党而言&#xff0c;保持手机电量充足是学习、社交和娱乐的基本保证。然而&#xff0c;面对频繁的使用&#xff0c;手机电量常常不够用&#xff0c;这时一款性能优良的充电宝就显得尤为重要。那么&#xff0c;充电宝哪个牌子好呢&#xff1f;对于学生党来说&#xff0c;…

番茄钟工作法

目录 1.使用番茄钟的注意事项和技巧: 2.番茄工作法的优点: 3.番茄钟案例: 从棉花糖实验说起 我得了什么「病」&#xff1f; 外界的诱惑 失效的 Deadline 永远停留在纸上的计划 番茄土豆大作战&#xff1a;番茄工作法简明教程 计划 执行 记录与分析 番茄工作法怎么…

可视化图表与源代码显示的动态调整

可视化图表与源代码显示的动态调整 页面效果描述&#xff1a;本篇代码实现了通过拖动一个可调整大小的分隔符&#xff0c;用户可以动态地调整图表显示区域和源代码显示区域的大小。通过监听鼠标事件&#xff0c;当用户拖动分隔符时&#xff0c;会动态计算并更新两个区域的大小 …

俄组织Fighting Ursa利用虚假汽车销售广告传播HeadLace后门

最近&#xff0c;Palo Alto Networks的科研人员揭露了有一个与俄罗斯有关联的威胁行动者——Fighting Ursa&#xff08;亦称APT28、Fancy Bear或Sofacy&#xff09;。该组织通过散布虚假的汽车销售广告&#xff0c;特别是针对外交官群体&#xff0c;散播名为HeadLace的后门恶意…

6款打印刻录监控与审计系统 | 一键解锁器功能探析

信息高度敏感的社会环境&#xff0c;企事业单位对于文档的安全传输、打印与刻录过程的监控与审计需求日益迫切。 然而&#xff0c;为了全面满足读者对安全工具的了解需求&#xff0c;这篇文章小编将首先概述几款领先的打印刻录监控与审计系统&#xff0c;随后简要提及“一键解…

【Java】Collection中自定义类重写contains方法。

如果集合中存储的是自定义对象&#xff0c;也想使用contaisn方法来判断是否包含&#xff0c;那么在javabean类中&#xff0c;一定要重写equals方法。 因为contains方法的底次是使用equals方法实现的&#xff0c;所以重写equals方法。 Main类&#xff1a; package demo;import…

SQL注入(闯关游戏)

目录 关卡1 关卡2 关卡3 关卡4 关卡5 关卡6 关卡7 关卡8 关卡9 关卡10 关卡11 关卡12 关卡13 关卡14 关卡15 关卡16 关卡17 关卡18 关卡19 关卡20 关卡21 关卡22 关卡23 关卡24 关卡1 (联合查询) ?gid1 第一件事情就是逃脱单引号的控制——》为了闭…

vue+element 根据父容器动态设置table高度出滚动条

可以通过CSS样式来控制表格的高度&#xff0c;并使用JavaScript动态地设置这个高度。 HTML: <template><el-table:data"tableData":height"tableHeight"style"width: 100%"><!-- 列配置 --></el-table> </template&…

【Kubernetes】Deployment 的清理策略

Deployment 的清理策略 在 Deployment 中配置 spec.revisionHistoryLimit 字段&#xff0c;可以指定其 清理策略。该字段用于指定 Deployment 保留旧 ReplicaSet 的个数&#xff0c;即更新 Pod 前的版本个数。该字段的默认值是 10。 创建 revisionhistory-demo.yaml 文件&…

一文了解K8S(Kubernates)

一、K8S 1. 概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、支持和工具的使用范围相当广泛。 Kubernetes 这个名字源于希腊…

Unity 功能 之 创建 【Unity Package】 Manager 自定义管理的包使用配置URL,使用 git URL加载的简单整理

Unity 功能 之 创建 【Unity Package】 Manager 自定义管理的包使用配置URL&#xff0c;使用 git URL加载的简单整理 目录 Unity 功能 之 创建 【Unity Package】 Manager 自定义管理的包使用配置URL&#xff0c;使用 git URL加载的简单整理 一、简单介绍 二、Unity Package …

【你也能从零基础学会网站开发】SQL Server 2000中的数据类型之String字符串类型

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 SQL Server 中…

c++ | vector

前言 本篇博客讲解cSTL中的vector &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞…

珠江电缆,顺应全球变化,实现高质量出海

在全球经济快速变化的今天&#xff0c;越来越多的企业将目光投向了国际市场。特别是对于线缆行业来说&#xff0c;顺应全球变化、应对机遇与挑战&#xff0c;实现高质量出海已成为长期发展的战略目标之一。珠江电缆作为一家集研发、制造和销售为一体的大型专业电线电缆企业&…

智能电表在什么情况下需要加装互感器?

智能电表作为现代电力系统中不可或缺的一部分&#xff0c;负责准确计量电力消耗。然而&#xff0c;在某些特定条件下&#xff0c;仅凭智能电表无法满足高精度测量需求&#xff0c;此时便需引入互感器。本文将深入解析智能电表与互感器的协作原理&#xff0c;明确指出加装互感器…

ASR(Automatic Speech Recognition)调研,当前sota的架构

asr概览英文纯享版&#xff1a;an overview of transducer models for asr 本文主要讲述nvidia和openai的模型架构&#xff0c;应为他们两家霸榜huggingface leader board 小白也能阅读了解一下当前sota的asr架构是什么样的 评测指标 Word Error Rate (WER)&#xff1a;错词率…

关于使用QListView向模型插入第一条数据的相关问题

在使用QListView的时候&#xff0c;看着它的四个尖角不爽&#xff0c;想着让它变成圆角矩形吗&#xff0c;但麻烦就接踵而至了。。。 在向其中插入第一条数据的时候发现&#xff0c;你插入的一条数据它存在边界超过QListView的现象。如下图所示&#xff1a; 这就令人头大了&am…