首页 > 编程语言 >代码随想录算法训练营day51| 卡码网99.岛屿数量 卡码网100.岛屿的最大面积

代码随想录算法训练营day51| 卡码网99.岛屿数量 卡码网100.岛屿的最大面积

时间:2024-11-19 21:43:26浏览次数:1  
标签:卡码 cur 岛屿 随想录 next range grid visited True

学习资料:https://www.programmercarl.com/kamacoder/0099.岛屿的数量深搜.html#思路

深度优先搜索和广度优先搜索
今天用的邻接矩阵

学习记录:
卡码网99.岛屿数量 (深搜or广搜;用一个自己设计的二维矩阵来控制节点的移动方向:上下左右)

点击查看代码
from collections import deque
direction = [[1,0], [0,1], [-1,0], [0, -1]]  # 上,右,下,左

def bfs(visited, grid, x, y):
    """广搜"""
    que = deque([])
    que.append([x, y])
    while que:
        cur_x, cur_y = que.popleft()
        for i, j in direction:
            next_x = cur_x + i
            next_y = cur_y + j
            if next_x<0 or next_x>=len(grid) or next_y<0 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 dfs(visited, grid, x, y):
    """深搜"""
    for i, j in direction:
        next_x = x+i
        next_y = y + j
        # 下标越界,跳过 (这一小片区域的边界)
        if next_x<0 or next_x>=len(grid) or next_y<0 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
            dfs(visited, grid, next_x, next_y)

if __name__ == "__main__":
    n, m = map(int, input().split())
    
    # 构造邻接矩阵
    grid = []
    for i in range(n):
        grid.append(list(map(int, input().split())))
    
    # 构造访问表,若以访问则为True
    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
                visited[i][j] = True
                bfs(visited, grid, i, j)   # dfs(visited, grid, i, j) 也可以
    
    print(res)

卡码网100.岛屿的最大面积(深搜法;给前面这道题的基础上,遍历每片岛屿时,要记录每个陆地值得到岛屿面积)

点击查看代码
directions = [[1,0],[0,1],[-1,0],[0,-1]]
count = 0

def dfs(visited, grid, x, y):
    global count   # 设置全局变量
    for i,j in directions:
        cur_x = x + i
        cur_y = y + j
        if cur_x<0 or cur_x>=len(grid) or cur_y<0 or cur_y>=len(grid[0]):
            continue
        if not visited[cur_x][cur_y] and grid[cur_x][cur_y]==1:
            visited[cur_x][cur_y] = True
            count += 1
            dfs(visited, grid, cur_x, cur_y)



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)]

result = 0     # 记录count的最大值

for i in range(n):
    for j in range(m):
        if grid[i][j]==1 and not visited[i][j]:
            count = 1
            visited[i][j] = True
            dfs(visited, grid, i, j)
            result = max(result, count)

print(result)

PS:不想学习的一天,想念卡哥视频的一天,啥时候出图论啊
学的比较潦草,多复习
好冷,今天吃了好多美食,豆花牛肉、大盘鸡、凉皮、羊肉抓饭、冰淇淋,嗝~
让我们一起倒数十个数!

标签:卡码,cur,岛屿,随想录,next,range,grid,visited,True
From: https://www.cnblogs.com/tristan241001/p/18555642

相关文章

  • 代码随想录:移除链表元素
    代码随想录:移除链表元素简单的链表操作,注意C++中在访问一个实体结构体时,用.来进行元素访问ListNodehead;head.val=10;head.next=nullptr;在访问一个指针变量时,用→来进行元素访问,如在本题中,题目给的head是一个指针,所以所有的变量访问都用→/***Definitionforsing......
  • 代码随想录:设计链表
    代码随想录:设计链表这题遇到的问题是,在private中声明后,在构造函数中初始化的时候又声明了一次,大类的构造函数和结构体的构造函数弄晕掉了。另外虚头节点是真好用,以后记得用。一开始写成了这样:classMyLinkedList{public:structLinkNode{intvalue;......
  • 代码随想录算法训练营第七天(LeetCode454.四数相加Ⅱ;LeetCode383.赎金信;LeetCode15.三
    LeetCode454.四数相加Ⅱ题目链接:四数相加Ⅱ题目链接思路这道题目给定我们四个数组,让我们判断从四个数组中分别取一个元素,然后将这四个元素相加,值为0的元组个数,所以我们可以模仿两数之和,因为四个数组中分别取元素就是任意取,不需要考虑去重的问题,所以可以将四个数组转......
  • 代码随想录算法训练营第八天(LeetCode344.反转字符串;LeetCode541.反转字符串Ⅱ;卡码网54
    LeetCode344.反转字符串题目链接:反转字符串题目链接思路这道题目让我们进行字符串的反转,其实直接使用reverse相关的函数就可以解决问题。但是解决问题的时候,如果这道题目使用库函数就可以直接解决,就最好不要使用库函数;如果库函数只是题目中解法的一小步,那么就使用......
  • 代码随想录算法训练营第六天|哈希表|LC242. 有效的字母异位词|LC349. 两个数组的交集|
    哈希表    哈希表:用来快速判断一个元素是否出现在集合里;O(1);    哈希碰撞:比如小王和小李都映射到索引下表1的位置,有2中解决办法(拉链法和线性探测法);    拉链发:通过索引找到,其实拉链发就是要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内......
  • 代码随想录算法训练营第四天|LC24.两两交换链表中的节点|LC19. 删除链表的倒数第 N 个
    24.两两交换链表中的节点-力扣(LeetCode)    1、需要一个虚拟节点进行帮助;    2、注意虚拟节点的连接以及变化(尝试有点困惑它的变化,后面有点理解);    3、注意后续第二组的交换时如何与第一组交换进行连接;fromtypingimportOptionalclassLis......
  • 代码随想录算法训练营第三十二天| 509. 斐波那契数 、70. 爬楼梯、746. 使用最小花费
    理论基础总结一下就是:动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。动态规划五部曲确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组509.斐波那契数1.......
  • 代码随想录算法训练营第三十三天| 62.不同路径 、63. 不同路径 II、343. 整数拆分 。c
    62.不同路径思路:按照dp五步法分析,成功AC。代码随想录classSolution{publicintuniquePaths(intm,intn){int[][]dp=newint[m+1][n+1];dp[0][1]=1;for(inti=1;i<=m;i++){for(intj=1;j<=n;j++){......
  • 代码随想录:螺旋矩阵 II
    代码随想录:螺旋矩阵II题目是不难的,本质是重复多次顺时针旋转,注意边界条件。我第一次写错是二维数组的运用出了问题,vec[i][j]中,i代表行,j代表列,我的脑袋是明白的,但是在运用时,一开始二维矩阵向右遍历时,其实变的是j而非i另外注意一下二维vector的建立就行//二维vector数组本质上......
  • 代码随想录:长度最小的子数组
    代码随想录:长度最小的子数组现在不像考研那时候,每天时间都是固定的,以后可能还是以周为单位定目标比较好一点滑动窗口问题,之后记得和计算机网络里的滑动窗口对比,并且和背包问题对比classSolution{public:intminSubArrayLen(inttarget,vector<int>&nums){i......