代码随想录算法训练营第五十一天|卡玛网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 本题小结
- 现在真的,我其实有点不理解这种题目的,所以就是看着别人的方法,自己慢慢敲,但是敲完以后我就理解了为什么
- 多去看多去思考吧,先做好这一步骤,再继续往下来吧
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 本题小结
- 就是使用的方法不一样,但是主要的逻辑的深度搜索没区别,希望我后面可以掌握的更好一些吧,继续加油
- 又是学会了一种新的方法
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 本题小结
- 这个题目,其实跟上一题差不多,多了一个计算的,也没什么本质的区别吧
- 但是不理解为什么将后面内容写成主函数会报错
4 今日小结
- 就是,嗯自己写会懵,目前还是需要辅助来写吧,因为没有视频,实在是很难习惯,不过已经尽量让自己习惯这个事儿了
- 这一块主体内容大概就是这么多吧,其他的,还有很多改进的空间

浙公网安备 33010602011771号