给定一个m行n列的二维地图, 初始化每个单元都是水.
操作addLand 把单元格(row,col)变成陆地.
岛屿定义为一系列相连的被水单元包围的陆地单元, 横向或纵向相邻的陆地称为相连(斜对角不算).
在一系列addLand的操作过程中, 给出每次addLand操作后岛屿的个数.
二维地图的每条边界外侧假定都是水.
多组测试数据,请参考例题处理 每组数据k+3行, k表示addLand操作次数 第一行:表示行数m 第二行:表示列数n 第三行:表示addLand操作次数k 第4~k+3行:row col 表示addLand的坐标。注意超过边界的坐标是无效的。
一行,k个整数, 表示每次addLand操作后岛屿的个数, 用空格隔开,结尾无空格
3 3 4 0 0 0 1 1 2 2 1
1 1 2 3
n = eval(input()) m = eval(input()) k = eval(input()) row_,col_,count_ = [],[],[] count = 0 def find_all_index(arr, item): return [i for i, a in enumerate(arr) if a == item] for i in range(k): row,col = list(map(int,input().split(' '))) if row>n or col>m: print("坐标无效请重新输入。") i=i-1 elif row in row_: temp_ = find_all_index(row_,row) for item in temp_: if abs(col_[item]-col)<=1: row_.append(row) col_.append(col) count_.append(count) else: row_.append(row) col_.append(col) count = count + 1 count_.append(count) elif col in col_: temp_ = find_all_index(col_,col) for item in temp_: if abs(row_[item]-row)<=1: row_.append(row) col_.append(col) count_.append(count) else: row_.append(row) col_.append(col) count = count + 1 count_.append(count) else: row_.append(row) col_.append(col) count = count + 1 count_.append(count) for item in count_: print(item,end=' ')
核心思想只有一句(注释那行):
新的岛屿数目 = 原有岛屿数目 + 1 - 现添加位置的联通桥数目
这里的联通桥,指该点与原集合中存在相邻上下左右点(岛)的数目
#islandNum = islandNum+1-countBridge !!! row,col,optNum = int(input()),int(input()),int(input()) land,islandNum,island = [],0,'' for i in range(optNum): addLand = list(map(int,input().split())) if addLand[0]>row-1 or \ addLand[1]<col-1: pass else: loc = (addLand[0],addLand[1]) bridgeNum = 0 if loc not in land: bridgeNum += int((loc[0]-1,loc[1]) in land)+ \ int((loc[0]+1,loc[1]) in land)+ \ int((loc[0],loc[1]-1) in land)+ \ int((loc[0],loc[1]+1) in land) land.append(loc) islandNum += 1-bridgeNum if islandNum==0: islandNum = 1 island += str(islandNum)+' ' print(island[:-1])
经典的岛屿问题,又掏出了我的祖传代码。
不过题目有坑:
代码如下:
import copy
class Solution:
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
if not grid: return 0
row, col = len(grid), len(grid[0])
res = 0
for i in range(row):
for j in range(col):
if grid[i][j] == "1":
res += 1
self.merge(grid, i, j)
return res
def merge(self, grid, i, j):
row = len(grid)
col = len(grid[0])
if i < 0 or i >= row or j < 0 or j >= col or grid[i][j] != "1": # 退出dfs的条件:1.越界;2.遇到值为0或者已访问的节点(X)
return
grid[i][j] = "X" # 置为"X", 表示该元素已被访问。
"""向四个方向查找"""
self.merge(grid, i - 1, j)
self.merge(grid, i + 1, j)
self.merge(grid, i, j - 1)
self.merge(grid, i, j + 1)
m, n, k = [int(input()) for _ in range(3)]
land, grid = [["0" for i in range(n)] for j in range(m)], []
solution = Solution()
res = [0]
for i in range(k):
row, col = map(int, input().split())
if row < m and col < n:
land[row][col] = "1"
grid = copy.deepcopy(land)
res.append(str(solution.numIslands(grid)))
else:
res.append(res[-1])
print(" ".join(res[1:]))