马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
孤岛的总面积
这道题先将靠近边界限上的岛屿都放置为0,然后再用深度大概广度搜刮算法去盘算剩余的孤岛总面积- count = 0
- position = [[1, 0], [0, 1], [-1, 0], [0, -1]]
- def dfs(matrix,x,y):
- global count
- matrix[x][y] = 0
- count += 1
- for i,j in position:
- next_x = x + i
- next_y = y + j
- if next_x < 0 or next_y < 0 or next_x >= len(matrix) or next_y >= len(matrix[0]):
- continue
- if matrix[next_x][next_y] == 1:
- dfs(matrix,next_x,next_y)
-
- N,M = map(int,input().split())
- matrix = []
- for _ in range(N):
- matrix.append(list(map(int,input().split())))
- for i in range(N):
- if matrix[i][0] == 1:
- dfs(matrix,i,0)
- if matrix[i][M-1] == 1:
- dfs(matrix,i,M-1)
-
- for j in range(M):
- if matrix[0][j] == 1:
- dfs(matrix,0,j)
- if matrix[N-1][j] == 1:
- dfs(matrix,N-1,j)
- count=0
- for i in range(N):
- for j in range(M):
- if matrix[i][j] == 1:
- dfs(matrix,i,j)
- print(count)
复制代码 淹没孤岛
这道题思绪和上面一样,不外这里必要将边界上的岛屿酿成2。那么此时矩阵当中就只有靠近边界上的2以及孤岛1。这时间只必要将全部数值为2大概为1的都减去1即可。- position = [[1, 0], [0, 1], [-1, 0], [0, -1]]
- def dfs(matrix,x,y):
- matrix[x][y] = 2
- for i,j in position:
- next_x = x + i
- next_y = y + j
- if next_x < 0 or next_y < 0 or next_x >= len(matrix) or next_y >= len(matrix[0]):
- continue
- if matrix[next_x][next_y] == 1:
- dfs(matrix,next_x,next_y)
-
- N,M = map(int,input().split())
- matrix = []
- for _ in range(N):
- matrix.append(list(map(int,input().split())))
- for i in range(N):
- if matrix[i][0] == 1:
- dfs(matrix,i,0)
- if matrix[i][M-1] == 1:
- dfs(matrix,i,M-1)
-
- for j in range(M):
- if matrix[0][j] == 1:
- dfs(matrix,0,j)
- if matrix[N-1][j] == 1:
- dfs(matrix,N-1,j)
- count=0
- for i in range(N):
- for j in range(M):
- if matrix[i][j] == 1 or matrix[i][j] == 2:
- matrix[i][j] -= 1
-
- for l in matrix:
- print(" ".join(map(str,l)))
复制代码 水流题目
现有一个 N × M 的矩阵,每个单元格包罗一个数值,这个数值代表该位置的相对高度。矩阵的左边界和上边界被以为是第一组边界,而矩阵的右边界和下边界被视为第二组边界。
矩阵模拟了一个地形,当雨水落在上面时,水会根据地形的倾斜向低处活动,但只能从较高或等高的所在流向较低或等高而且相邻(上下左右方向)的所在。我们的目标是确定那些单元格,从这些单元格出发的水可以到达第一组边界和第二组边界。
这道题我们从各边界逆着往内去找可达的路径,然后取这两个可达路径的交集即可。- N,M = map(int,input().split())
- matrix = []
- for _ in range(N):
- matrix.append(list(map(int,input().split())))
- first = set()
- second = set()
- directions = [[-1, 0], [0, 1], [1, 0], [0, -1]]
- def dfs(i,j,grid,visited,side):
- if visited[i][j]:
- return
- visited[i][j] = True
- side.add((i,j))
- for x,y in directions:
- new_x = x + i
- new_y = y + j
- if 0<= new_x < N and 0<= new_y < M and grid[i][j] <= grid[new_x][new_y]:
- dfs(new_x,new_y,grid,visited,side)
- visited = [[False] * M for _ in range(N)]
- for i in range(N):
- dfs(i,0,matrix,visited,first)
- for j in range(M):
- dfs(0,j,matrix,visited,first)
- visited = [[False] * M for _ in range(N)]
- for i in range(N):
- dfs(i,M-1,matrix,visited,second)
- for j in range(M):
- dfs(N-1,j,matrix,visited,second)
- res = first & second
- for x,y in res:
- print(f"{x} {y}")
复制代码 制作最大岛屿
这道题先将各个岛用差别的数字标示出来,并盘算每个岛的面积,而后遍历每个海水记载可以由该海水块毗连起来的陆地的最大面积。- N,M = map(int,input().split())
- matrix = []
- for _ in range(N):
- matrix.append(list(map(int,input().split())))
- directions = [[-1, 0], [0, 1], [0, -1], [1, 0]]
- area = 0
- def dfs(i,j,grid,visited,num):
- global area
- if visited[i][j]:
- return
-
- visited[i][j] = True
- grid[i][j] = num
- area += 1
- for x, y in directions:
- new_x = x + i
- new_y = y + j
- if 0 <= new_x < N and 0 <= new_y < M and grid[new_x][new_y] == 1:
- dfs(new_x,new_y,grid,visited,num)
- cnt = 2
- visited = [[False] * M for _ in range(N)]
- rec = {}
- for i in range(N):
- for j in range(M):
- if matrix[i][j] == 1:
- area = 0
- dfs(i,j,matrix,visited,cnt)
- rec[cnt] = area
- cnt += 1
- res = 0
- for i in range(N):
- for j in range(M):
- if matrix[i][j] == 0:
- max_island = 1
- v = set()
- for x, y in directions:
- new_x = x + i
- new_y = y + j
- if 0 <= new_x < N and 0 <= new_y < M and matrix[new_x][new_y] != 0 and matrix[new_x][new_y] not in v:
- max_island += rec[matrix[new_x][new_y]]
- v.add(matrix[new_x][new_y])
- res = max(res,max_island)
- if res == 0:
- print(max(rec.values()))
- else:
- print(res)
复制代码 |