首页 > pdd 第二题,哪位大佬帮看看呀,代码易读
头像
放弃幻想,准备战斗
编辑于 2020-09-01 21:24
+ 关注

pdd 第二题,哪位大佬帮看看呀,代码易读

思路:bfs求出所有的连在一起的点集,构造一个新的矩阵表示,然后枚举为0的点,根据周围的情况求解。是哪里想错了吗。。?

from collections import deque
def f():
N,M=map(int,input().split())
mat=[]
sums=0
directions=[(0,1),(0,-1),(1,0),(-1,0)]
for _ in range(N):
mat.append(list(map(int,input().split())))
sums+=sum(mat[-1])

def bfs(i,j,N,M):
q=deque([(i,j)])
idx=[]
cnt=0
while q:
cur=q.popleft()
mat[cur[0]][cur[1]]=2
cnt+=1
idx.append(cur)
for dx,dy in directions:
x,y=cur[0]+dx,cur[1]+dy
if 0<=x<N and 0<=y<M and mat[x][y]==1:
q.append((x,y))
return (cnt,idx)

lands=[]
for i in range(N):
for j in range(M):
if mat[i][j]==1:
lands.append(bfs(i,j,N,M))
lands.sort()

mat2=[[(0,-1) for _ in range(M)] for _ in range(N)]
for i,(cnt,idx) in enumerate(lands):
for x,y in idx:
mat2[x][y]=(cnt,i)
# for l in mat2:
#     print(l)


res=0
for i in range(N):
for j in range(M):
if mat2[i][j]==(0,-1):
tmp=1
appeared=set()
for dx, dy in directions:
x, y = i + dx, j + dy
if 0 <= x < N and 0 <= y < M  and mat2[x][y][1] not in appeared:
tmp+=mat2[x][y][0]
appeared.add(mat2[x][y][1])
# if res==10:print(i,j)
# print(tmp)
res=max(res,tmp)
res=min(res,sums)
print(res)


f()




拜托了,另一个我

全部评论

(1) 回帖
加载中...
话题 回帖

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐