首页 > 其他分享 >代码随想录day16--图论

代码随想录day16--图论

时间:2024-09-03 21:53:36浏览次数:15  
标签:陆地 __ -- 随想录 next day16 grid visited que

题目描述: 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

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

输出描述: 输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。

输入示例:

4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1

输出示例:3

本题思路:     遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。 再遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。 那么如果把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。

bfs写法

不少同学用广搜做这道题目的时候,超时了。 这里有一个广搜中很重要的细节:

根本原因是只要 加入队列就代表 走过,就需要标记,而不是从队列拿出来的时候再去标记走过。

from collections import deque
directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]
def bfs(grid, visited, x, y):
    que = deque([])
    que.append([x,y])
    while que:
        cur_x, cur_y = que.popleft()
        for i, j in directions:
            next_x = cur_x + i
            next_y = cur_y + j
            if next_y < 0 or next_x < 0 or next_x >= len(grid) or next_y >= len(grid[0]):
                continue
            if not visited[next_x][next_y] and grid[next_x][next_y] == 1: 
                visited[next_x][next_y] = True
                que.append([next_x, next_y])


def main():
    n, m = map(int, input().split())
    grid = []
    for i in range(n):
        grid.append(list(map(int, input().split())))
    visited = [[False] * m for _ in range(n)]
    res = 0
    for i in range(n):
        for j in range(m):
            if grid[i][j] == 1 and not visited[i][j]:
                res += 1
                bfs(grid, visited, i, j)
    print(res)

if __name__ == "__main__":
    main()

代码随想录day16--图论_广搜

















标签:陆地,__,--,随想录,next,day16,grid,visited,que
From: https://blog.51cto.com/u_16373090/11910765

相关文章

  • Hadoop 第七周总结
    Hadoop第七周总结在第七周的学习中,我深入探讨了Hadoop生态系统中的几个关键组成部分,重点包括HadoopMapReduce、HDFS(HadoopDistributedFileSystem)、YARN(YetAnotherResourceNegotiator),以及Hadoop的调优策略。以下是本周学习的主要内容和总结:1.HadoopMapReduceMapReduce......
  • 大二必做项目贪吃蛇超详解之下篇游戏核心逻辑实现
    贪吃蛇系列文章上篇win32库介绍中篇设计与分析下篇游戏主逻辑可以在Gitee上获取贪吃蛇代码。文章目录贪吃蛇系列文章5.核心逻辑实现分析5.3GameRun5.3.1PrintScore5.3.2CheckVK5.3.3BuyNewNode5.3.4NextIsFood5.3.4EatFood5.3.5NotFood5.3.6C......
  • 日志技术
    概述把程序运行的信息记录到文件中,方便程序员定位Bug,并了解程序的执行情况。把系统执行的信息,方便的记录的指定的位置(控制台、文件、数据库)。可以随时以开关的形式控制日志的启停,无需侵入到源代码中进行修改。日志框架(1)配置文件,将下面三个jar包导入到库(2)将Logback框架的核心文件log......
  • 【问题记录】【数据库】库存或者账户流水记录修复
    1 前言大家的系统有没有关于客户资金、会员卡余额、库存记录等,这些相关信息的存储,说白了就是流水记录表。不知道大家是如何存储的,我们的存储一条记录最起码的是变动数量、变动前数量、变动后数量,这个变动前、变动后就粘的比较紧,那么当系统出现问题的时候,可能中间差一条变动,那么......
  • ElasticSearch 备考 -- Nested
    一、题目存在索引phones,其中存在两条数据如下PUTphones/_doc/1{  "brand":"Samsumg",  "model":"GalaxyS9+",  "features":[    {      "type":"os",      "value":&......
  • 深入浅出Stream流
    Java8的新特性之一就是流stream,配合同版本出现的Lambda,使得操作集合(Collection)提供了极大的便利。案例引入在JAVA中,涉及到对数组、Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。假设遇到了这么一个需求:从给定句......
  • Hadoop 第八周总结
    Hadoop第八周总结在第八周的学习中,我进一步探索了Hadoop生态系统的高级功能和工具,主要集中在Hadoop的优化技巧、数据处理框架的整合以及大数据应用的实际案例。以下是本周学习的主要内容和总结:1.Hadoop的性能优化在处理大规模数据时,性能优化至关重要。本周我深......
  • 深入理解Android Activity的四种LaunchMode
            在Android开发中,Activity的启动模式(LaunchMode)是控制Activity实例创建、复用及在任务(Task)中排列方式的重要机制。理解并掌握这些模式对于构建高效、流畅的用户体验至关重要。本文将详细探讨standard、singleTop、singleTask和singleInstance这四种启动模式,并通......
  • Python参数传递的艺术:解锁编程灵活性的秘密武器
    引言参数传递作为函数调用过程中的关键环节,对程序逻辑有着重要影响。不同的参数传递方式能够帮助我们更好地组织代码,提高程序运行效率。比如,在处理大量数据或复杂业务逻辑时,合理的参数设计可以让我们的代码更简洁、更高效;而在进行单元测试或者接口调试时,灵活的参数机制又能极大地......
  • malloc/free 和 new/delete的区别
    malloc/free和new/delete是C++中两种不同的动态内存管理方法,它们有一些关键的区别:1.内存分配和释放机制malloc和free:函数:malloc是一个C标准库函数,用于从堆中分配指定大小的原始内存块。它返回一个void*指针,指向分配的内存块的起始位置。free用于释放由......