99.岛屿数量 深搜
思路:这道题也可以算是深搜的模板题了,不过已经很久没做深搜了,还是讲讲退出dfs的两种处理方法。一种是没有明显的return,另一种是有。有的情况就是先判断节点是否合法,一定要是合法的节点才会进行后续的运算。没有return其实也没啥区别,只是不会有一个明显的退出环节
python
direction=[[0,1],[0,-1],[1,0],[-1,0]]
def main():
n,m=map(int,input().split())
graph=[]
for i in range(n):
graph.append(list(map(int,input().split())))
visit=[[False]*m for _ in range(n)]
result=0
for i in range(n):
for j in range(m):
if graph[i][j]==1 and not visit[i][j]:
result+=1
visit[i][j]=True
dfs(graph,visit,i,j)
print(result)
def dfs(graph,visit,x,y):
for i,j in direction:
next_x=x+i
next_y=y+j
if next_x<0 or next_x>=len(graph):
continue
if next_y<0 or next_y>=len(graph[0]):
continue
if not visit[next_x][next_y] and graph[next_x][next_y]==1:
visit[next_x][next_y]=True
dfs(graph,visit,next_x,next_y)
if __name__=="__main__":
main()
python
direction=[[0,1],[0,-1],[1,0],[-1,0]]
def main():
n,m=map(int,input().split())
graph=[]
for i in range(n):
graph.append(list(map(int,input().split())))
visit=[[False]*m for _ in range(n)]
result=0
for i in range(n):
for j in range(m):
if graph[i][j]==1 and not visit[i][j]:
result+=1
dfs(graph,visit,i,j)
print(result)
def dfs(graph,visit,x,y):
if visit[x][y] or graph[x][y]==0:
return
visit[x][y]=True
for i,j in direction:
next_x=x+i
next_y=y+j
if next_x<0 or next_x>=len(graph):
continue
if next_y<0 or next_y>=len(graph[0]):
continue
if not visit[next_x][next_y] and graph[next_x][next_y]==1:
dfs(graph,visit,next_x,next_y)
if __name__=="__main__":
main()
99.岛屿数量 广搜
思路:同样的,这道题是广搜的模板题,不过其实我对广搜不熟悉,所以写起来挺费劲的。广搜和之前二叉树的层序遍历一样,都要使用队列。main函数的部分,其实和dfs相同,在进入了bfs之后,首先给自己的位置visit数组变成True,然后将这个位置加入队列,接下来遍历队列,将每个方向的合法新位置加入队列,直到队列为空。
python
from collections import deque
directions=[[0,1],[0,-1],[1,0],[-1,0]]
def main():
n,m=map(int,input().split())
graph=[]
for i in range(n):
graph.append(list(map(int,input().split())))
visit=[[False]*m for _ in range(n)]
result=0
for i in range(n):
for j in range(m):
if not visit[i][j] and graph[i][j]==1:
result+=1
bfs(graph,visit,i,j)
print(result)
def bfs(graph,visit,x,y):
que=deque([])
que.append([x,y])
visit[x][y]=True
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_x<0 or next_x>=len(graph) or next_y<0 or next_y>=len(graph[0]):
continue
if not visit[next_x][next_y] and graph[next_x][next_y]==1:
que.append([next_x,next_y])
visit[next_x][next_y]=True
if __name__=="__main__":
main()
100.岛屿的最大面积
思路:这道题基本上就是模板题上加一个统计,不过需要注意的有两个点。一个是cnt+1只会在判断合法后使用,第二个就是cnt如果要全局定义有两种方法,一是将cnt定义为一个数组,所有变化都发生在cnt[0]上,二是在dfs中定义nonlocal cnt
python
cnt=[0]
directions=[[1,0],[-1,0],[0,1],[0,-1]]
def main():
n,m=map(int,input().split())
graph=[]
for i in range(n):
graph.append(list(map(int,input().split())))
visit=[[False]*m for _ in range(n)]
result=0
for i in range(n):
for j in range(m):
if not visit[i][j] and graph[i][j]==1:
visit[i][j]=True
cnt[0]=1
dfs(graph,visit,i,j)
result=max(result,cnt[0])
print(result)
def dfs(graph,visit,x,y):
for i,j in directions:
next_x=x+i
next_y=y+j
if next_x<0 or next_x>=len(graph):
continue
if next_y<0 or next_y>=len(graph[0]):
continue
if not visit[next_x][next_y] and graph[next_x][next_y]:
visit[next_x][next_y]=True
cnt[0]+=1
dfs(graph,visit,next_x,next_y)
if __name__=="__main__":
main()
python
directions=[[1,0],[-1,0],[0,1],[0,-1]]
def main():
n,m=map(int,input().split())
graph=[]
for i in range(n):
graph.append(list(map(int,input().split())))
visit=[[False]*m for _ in range(n)]
result=0
def dfs(graph,visit,x,y):
nonlocal cnt
for i,j in directions:
next_x=x+i
next_y=y+j
if next_x<0 or next_x>=len(graph):
continue
if next_y<0 or next_y>=len(graph[0]):
continue
if not visit[next_x][next_y] and graph[next_x][next_y]:
visit[next_x][next_y]=True
cnt+=1
dfs(graph,visit,next_x,next_y)
for i in range(n):
for j in range(m):
if not visit[i][j] and graph[i][j]==1:
visit[i][j]=True
cnt=1
dfs(graph,visit,i,j)
result=max(result,cnt)
print(result)
if __name__=="__main__":
main()