卡码网104.建造最大岛屿

news/2024/10/7 17:42:45 标签: 深度优先, 算法

题目

104. 建造最大岛屿 (kamacoder.com)

代码(ACM 首刷看解析):

#include<iostream>
#include<vector>
#include<unordered_map>
#include<unordered_set>
using namespace std;

int dir[4][2] = {1,0,-1,0,0,1,0,-1};
int count;
int n, m;
void dfs(vector<vector<int>>&grid, int mark, int row, int col) {
    grid[row][col] = mark;
    count++;
    
    for (int i = 0; i < 4; i++) {
        int newRow = row + dir[i][0];
        int newCol = col + dir[i][1];
        if (newRow < 0 || newRow >= n || newCol < 0 || newCol >= m) continue;
        if (grid[newRow][newCol] != 1) continue;
        dfs(grid, mark, newRow, newCol);
    }
}

void print(vector<vector<int>>& arr, int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << arr[i][j] <<" ";
        }
        cout << endl;
    }
}

int main() {
    cin >> n >> m;
    vector<vector<int>> grid(n, vector<int>(m));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> grid[i][j];
        }
    }
    
    // print(grid, n, m);
    // cout<<endl;
    // 先遍历一遍,获得所有岛屿的最大值
    int mark = 2;
    count = 0;
    unordered_map<int,int> myMap;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (grid[i][j] == 1) {
                dfs(grid, mark, i, j);
                myMap[mark] = count;
                mark++;
                count = 0;
            }
        }
    }
    
    //print(grid, n, m);
    
    int maxResult = 0;
    unordered_set<int> us;
    bool AllisGrid = true;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (grid[i][j] == 0) {
                AllisGrid = false;
                int tmp = 0;
                for (int k = 0; k < 4; k++) {
                    int newI = i + dir[k][0];
                    int newJ = j + dir[k][1];
                    if (newI < 0 || newI >= n || newJ < 0 || newJ >= m) continue;
                    if (us.find(grid[newI][newJ]) == us.end()) {
                        tmp += myMap[grid[newI][newJ]];
                        us.insert(grid[newI][newJ]);
                    }
                }
                maxResult = max(tmp + 1, maxResult);
                us.clear();
                
                // cout << endl;
                // cout << "grid[" << i << "][" << j << "]:" << tmp << endl;
            } 
        }
    }
    if (AllisGrid) cout << n * m << endl;
    else cout << maxResult << endl;
    
    return 0;
}


http://www.niftyadmin.cn/n/5693129.html

相关文章

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 12数据中心中的EVPN

研究数据中心如何进行网络虚拟化配置之前&#xff0c;我们需要熟悉 EVPN的基础知识。如前所述&#xff0c;EVPN是一种为网络虚拟化提供控制平面的解决方案。用最简单的术语来说&#xff0c;EVPN是一种连接被三层网络分隔的二层网段的技术。EVPN通过在三层网络之上构建出一个叠加…

如何判断静态代理IP地址是否被污染?

在网络使用中&#xff0c;静态IP代理是一种常见的工具&#xff0c;用于维持稳定的连接和保护个人隐私。然而&#xff0c;有时这些IP地址可能会被污染&#xff0c;导致用户遭受各种问题&#xff0c;如连接延迟、数据泄露等。因此&#xff0c;了解如何判断址是否被污染至关重要。…

C嘎嘎入门篇:类和对象番外(时间类)

前文&#xff1a; 小编在前文讲述了类和对象的一部分内容&#xff0c;其中小编讲述过运算符重载这个概念以及一个时间类&#xff0c;当时小编讲的没有那么细致&#xff0c;下面小编将会讲述时间类来帮助各位读者朋友更好的去理解运算符重载&#xff0c;那么&#xff0c;代码时刻…

推理攻击-Python案例

1、本文通过推理攻击的方式来估计训练集中每个类别的样本数量、某样本是否在训练集中。 2、一种简单的实现方法&#xff1a;用模型对训练数据标签进行拟合&#xff0c;拟合结果即推理为训练集中的情况。 3、了解这些案例可以帮助我们更好的保护数据隐私。 推理攻击&#xff08;…

微服务获取用户信息和OpenFeign传递用户

问题一&#xff1a; 网关已经完成登录校验并获取登录用户身份信息。但是当网关将请求转发到微服务时&#xff0c;微服务又该如何获取用户身份呢&#xff1f; 由于网关发送请求到微服务依然采用的是Http请求&#xff0c;因此我们可以将用户信息以请求头的方式传递到下游微服务…

【YOLOv8实时产品缺陷检测】

YOLOv8应用于产品缺陷检测实例 项目概况项目实现YOLOv8安装及模型训练关键代码展示动态效果展示 项目概况 本项目是应用YOLOv8框架实现训练自定义模型实现单一零件的缺陷检测&#xff0c;软件界面由PyQt5实现。 功能已正式使用&#xff0c;识别效果达到预期。 项目实现 项目…

【M365运维】在SPO文档库里删除文档时,遇到文档被签出无法删除。

【问题】SPO的存储空间剩的不多了&#xff0c;在清理文档库时&#xff0c;遇到有些文档被签出但用户已经离职&#xff0c;删除文件时报错。 【解决】翻SPO的设置时&#xff0c;看到有“管理没有已签入版本的文件”&#xff0c;在里面获取文件的所有权之后就可以删除了。 具体…

Linux下网络转发功能

1、背景介绍 项目中使用上位机电脑&#xff0c;需要通过网络访问一个Linux主机&#xff0c;但是该Linux主机没有网络直接与上位机相连&#xff0c;只能通过插箱内另外一个Linux主机转发才能访问&#xff0c;示意图如下&#xff1a; 2、网络转发配置 Linux网络中转主机需要进行…