首页 > 其他分享 >934. 最短的桥

934. 最短的桥

时间:2023-04-13 17:47:56浏览次数:35  
标签:len 最短 bfs step grid dfs 点集 934

题目描述

矩阵中有两个岛屿
问岛之间的最小距离?

f1- bsf + bfs

基本分析

  1. 怎么求第一个岛的所有点?找到第一个1后bfs
  2. 怎么保证不重复添加?入队的点设置为-1
  3. 怎么求到第二个岛的最小距离?第一个岛的所有点入队,遍历一轮step+1,遇到1的时候返回step

代码

class Solution:
    def shortestBridge(self, grid):
        m, n = len(grid), len(grid[0])

        flag = True
        for i, row in enumerate(grid):
            for j, v in enumerate(row):
                if v != 1:
                    continue
                q = deque([(i, j)])
                grid[i][j] = -1
                island1 = []
                while q:
                    x, y = q.popleft()
                    island1.append((x, y))
                    for nx, ny in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)):
                        if 0 <= nx < m and 0 <= ny <n and grid[nx][ny] == 1:
                            q.append((nx, ny))
                            grid[nx][ny] = -1
   

                step = 0
                q = deque(island1)
                while q:
                    for _ in range(len(q)):
                        x, y = q.popleft()
                        for nx, ny in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)):
                            if 0 <= nx < m and 0 <= ny < n:
                                if grid[nx][ny] == 1:
                                    return step
                                if grid[nx][ny] == 0:
                                    q.append((nx, ny))
                                    grid[nx][ny] = -1
                    step += 1

总结

  1. 为啥在循环内bfs?找到第一个点集就开始bfs,不是在循环外bfs。如果这样,点集会是第二个岛,其余点都是-1了,没打进行第二轮bfs
  2. step怎么算?初始值设置为0,传播一圈后+1

f2 dfs + bfs

基本分析

  1. 找第一个点集还有啥其他方法?dfs

代码

class Solution:
    def shortestBridge(self, grid: List[List[int]]) -> int:
        m, n = len(grid), len(grid[0])
        
        def dfs(x, y):
            grid[x][y] = -1
            q.append((x, y))
            for nx, ny in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)):
                if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == 1:
                    dfs(nx, ny)

        for i, row in enumerate(grid):
            for j, v in enumerate(row):
                if v != 1:
                    continue
                q = []

                dfs(i, j)

                step = 0
                q = deque(q)
                while q:
                    for _ in range(len(q)):
                        x, y = q.popleft()
                        for nx, ny in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)):
                            if 0 <= nx < m and 0 <= ny < n: 
                                if grid[nx][ny] == 0:
                                    q.append((nx, ny))
                                    grid[nx][ny] = -1
                                if grid[nx][ny] == 1:
                                    return step
                    step += 1

总结

  1. 掌握dfs存第一个点集的思路

f3-并查集+ 双向bfs
待完善

基本分析

  1. xxx

代码


总结

  1. xxx

标签:len,最短,bfs,step,grid,dfs,点集,934
From: https://www.cnblogs.com/zk-icewall/p/17315785.html

相关文章

  • m基于GA遗传优化和OSPF协议的WSN最短路由算法matlab仿真,并输出节点的不同层域
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要2.1GA遗传优化        GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些假设解置于问题的“环境”中,并按......
  • 利用强化学习Q-Learning实现最短路径算法
    如果你是一名计算机专业的学生,有对图论有基本的了解,那么你一定知道一些著名的最优路径解,如Dijkstra算法、Bellman-Ford算法和a*算法(A-Star)等。这些算法都是大佬们经过无数小时的努力才发现的,但是现在已经是人工智能的时代,强化学习算法能够为我们提出和前辈一样好的解决方案吗?......
  • spfa求最短路——BFS,数组实现邻接表,数组实现队列
    题目描述题目来源AcWing给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。数据保证不存在负权回路。输入格式第一行包含整数n和m。接下来m行每行包含三个......
  • 2023-04-08 无向有权图之最短路径问题
    无向有权图之最短路径问题1有权图的最短路径问题什么是有权图的最短路径问题?从图中的一个点到另一个点的路径中,权值总和最小的路径就是最短路径最短路径的应用场景高德导航两个地点之间的路线,一般都是规划地最短路径互联网中对数据进行路由,一般都是选最优的路径进行数据......
  • ASEMI代理ADI(亚德诺)AD5934YRSZ-REEL7车规级芯片
    编辑-ZAD5934YRSZ-REEL7芯片参数:型号:AD5934YRSZ-REEL7阻抗范围:1k-10mΩ总系统精度:0.5%输出频率范围:1-100kHz输出频率分辨率:0.1Hz交流输出励磁电压:1.98V直流偏压:1.48V直流输出阻抗:200Ω信噪比:60dB宽带(0MHz至1MHz):-56dB窄带(±5kHz):-85dBAD5934YRSZ-REEL7特征:最大频率为100kHz的可编......
  • ASEMI代理ADI(亚德诺)AD5934YRSZ-REEL7车规级芯片
    编辑-ZAD5934YRSZ-REEL7芯片参数:型号:AD5934YRSZ-REEL7阻抗范围:1k-10mΩ总系统精度:0.5%输出频率范围:1-100kHz输出频率分辨率:0.1Hz交流输出励磁电压:1.98V直流偏压:1.48V直流输出阻抗:200Ω信噪比:60dB宽带(0MHz至1MHz):-56dB窄带(±5kHz):-85dB  AD5934YRSZ-REEL7特征:......
  • 删边最短路学习笔记
    删边最短路前言删边最短路是一种科技,用于解决一类问题:给定非负权图\(G=(V,E)\)。设\(n=|V|\),保证\(1\)可达\(n\)。设\(\Delta(e)\)为图\(G'=(V,E\setminus\{e\})\)上\(1\rightsquigarrown\)的最短路,若\(G'\)上\(1\)不可达\(n\)则为\(+\infty\)......
  • UVA - 116 Unidirectional TSP 多段图的最短路
    题目大意:给出一个矩阵,要求每列都要路过,起点必须是第一列,求经过的最短路径的上面的数字和最小解题思路:公式为d[i][j]=min(d[i][j+1],d[i+1][j+1],d[i-1][j+1])+a[i][j],本题要注意,因为可以从最上面一行到最后一行,或者从最后一行到第一行,注意i的变化#include<cstdio>#include<alg......
  • 129. 颜色交替的最短路径
    题目链接:129.颜色交替的最短路径方法:BFS解题思路当边的权重为\(1\)时,可以使用\(BFS\)计算最短路径;因为起始边有两种情况,所以都需要计算,最后取两者的最小值;代码classSolution{public:vector<int>shortestAlternatingPaths(intn,vector<vector<int>>&redEd......
  • ASEMI代理AD5934YRSZ-REEL7原装ADI车规级AD5934YRSZ-REEL7
    编辑:llASEMI代理AD5934YRSZ-REEL7原装ADI车规级AD5934YRSZ-REEL7型号:AD5934YRSZ-REEL7品牌:ADI/亚德诺封装:SSOP-16-208mil批号:2023+安装类型:表面贴装型AD5934YRSZ-REEL7汽车芯片AD5934YRSZ-REEL7特征可编程输出峰间激励电压至最大频率100kHz具有串行I2C的可编程频率扫......