代码随想录算法训练营第五十一天|卡玛网99. 岛屿数量、卡玛网100. 岛屿的最大面积

1 卡玛网99. 岛屿数量

题目链接:99. 岛屿数量

文章链接:代码随想录

思路:就是找到这一块的一个小矩形,但是我写的话,没有思路

1.1 讲解的方法

现在感觉还不具备,自己独立写这种题目的能力,但是我可以根据别人的代码去思考是为什么,我就可以掌握这种方法了,看着别人的代码,自己慢慢敲,然后理解了

direction = [[0,1],[1,0],[0,-1],[-1,0]]

def dfs(grid,visted,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 visted[next_x][next_y] and grid[next_x][next_y]==1:
            visted[next_x][next_y]=True
            dfs(grid,visted,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())))
        
    visted=[[False]*m for _ in range(n)]
    
    result = 0
    for i in range(n):
        for j in range(m):
            if grid[i][j]==1 and not visted[i][j]:
                result +=1
                visted[i][j]=True
                dfs(grid,visted,i,j)
    print(result)
    
if __name__ == '__main__':
    main()

1.2 本题小结

  1. 现在真的,我其实有点不理解这种题目的,所以就是看着别人的方法,自己慢慢敲,但是敲完以后我就理解了为什么
  2. 多去看多去思考吧,先做好这一步骤,再继续往下来吧

2 卡玛网99. 岛屿数量光搜版本

2.1 讲解的方法

主要的区别就在于中间的那一块内容吧,其他的好像也没啥区别了

from collections import deque
direction = [[0,1],[1,0],[0,-1],[-1,0]]

def bfs(grid,visted,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 visted[next_x][next_y] and grid[next_x][next_y]==1:
                visted[next_x][next_y]=True
                bfs(grid,visted,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())))
        
    visted=[[False]*m for _ in range(n)]
    
    result = 0
    for i in range(n):
        for j in range(m):
            if grid[i][j]==1 and not visted[i][j]:
                result +=1
                visted[i][j] =True
                bfs(grid,visted,i,j)
    print(result)
    
if __name__ == '__main__':
    main()

2.2 本题小结

  1. 就是使用的方法不一样,但是主要的逻辑的深度搜索没区别,希望我后面可以掌握的更好一些吧,继续加油
  2. 又是学会了一种新的方法

3 卡玛网100. 岛屿的最大面积

题目链接:100. 岛屿的最大面积

文章链接:代码随想录

3.1 自己的方法

先掌握好深度搜索吧,广度的话,我自己会不知道那个函数的含义,以后在掌握吧

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

def dfs(grid,vistied,x,y):
    global count
    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 vistied[next_x][next_y] and grid[next_x][next_y]==1:
            count += 1
            vistied[next_x][next_y] =True
            dfs(grid,vistied,next_x,next_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
for i in range(n):
    for j in range(m):
        if grid[i][j]==1 and not visited[i][j] :
            visited[i][j] = True
            count = 1
            dfs(grid,visited,i,j)
            result = max(result,count)
print(result)

3.2 本题小结

  1. 这个题目,其实跟上一题差不多,多了一个计算的,也没什么本质的区别吧
  2. 但是不理解为什么将后面内容写成主函数会报错

4 今日小结

  1. 就是,嗯自己写会懵,目前还是需要辅助来写吧,因为没有视频,实在是很难习惯,不过已经尽量让自己习惯这个事儿了
  2. 这一块主体内容大概就是这么多吧,其他的,还有很多改进的空间
posted @ 2024-12-13 19:17  小方呀0524  阅读(32)  评论(0)    收藏  举报