这个还是并查集的题目
首先理解题目意思:是说只要是与边界o连通的就不需要被覆盖
所以就是将与边界o连通的o找出来,剩下的将其覆盖掉
所以使用并查集,去一个个连通
这里有个细节,就是我只需要知道这个o与边界o相连就好,不需要知道具体是那个
边界o,所以可以采用一个公共的节点,所有边界o均与其相连,而o会去与边界o相连
(如果可以连通的话)这样就将所有的与边界o相连的放在一个连通区域中,集中管理
还有个细节,这里不是上下左右蛮,为了不重复计算,对于每一个节点,只取他的左边和上面,这样排除了冗余的判断
题目
class UFS:
def __init__(self,n):
self.parent=[0]*(n+1)
for i in range(n+1):
self.parent[i]=i
def find(self,node):
father=self.parent[node]
if node==father:
return node
self.parent[node]=self.find(father)
return self.parent[node]
def union(self,heada,headb):
fa=self.find(heada)
fb=self.find(headb)
if fa!=fb:
self.parent[fa]=fb
def is_same_set(self,nodea,nodeb):
return self.find(nodea)==self.find(nodeb)
def fun1(board):
select=[]
row=len(board)
col=len(board[0])
gjd=row*col
ufs=UFS(row*col)
for i in range(row):
for j in range(col):
if board[i][j]=="O":
cur=i*col+j
if i==0 or j==0 or i==row-1 or j==col-1:
ufs.union(cur,gjd)
if i>0:
pre=cur-col
if board[pre//col][pre%col]=="O":
ufs.union(pre,cur)
if j>0:
pre = cur - 1
if board[pre // col][pre % col] == "O":
ufs.union(pre, cur)
select.append(cur)
for item in select:
if not ufs.is_same_set(item,gjd):
board[item//col][item%col]="X"
return board