8.22 腾讯笔试第五题

题目:把被1围住的区域,变成2(注意外侧虽然有0被1围住了一部分,但是并不能变成2)

思路:外部往里回溯,就相当于从外边往里侵蚀,但是侵蚀不到被1围起来的区域。从里往外很难判断。
参考LC417洋流问题。

输入样例:
6
0 1 0 0 1 0
1 0 1 1 0 1
0 1 0 0 1 0
0 1 0 0 1 0
1 0 1 1 0 1
0 1 0 0 1 0

输出;
0 1 0 0 1 0
1 2 1 1 2 1
0 1 2 2 1 0
0 1 2 2 1 0
1 2 1 1 2 1
0 1 0 0 1 0

Process finished with exit code 0
def recurCore(grid, x, y, n):
    if x < 0 or x >= n or y < 0 or y >= n or grid[x][y] == 1 or grid[x][y] == -1:
        return
    grid[x][y] = -1 #被侵蚀到的先置为-1, 等待最后的处理。

    recurCore(grid, x + 1, y, n)
    recurCore(grid, x - 1, y, n)
    recurCore(grid, x, y + 1, n)
    recurCore(grid, x, y - 1, n)

    return

n = int(input())
grid = [[0] * n for _ in range(n)]

for i in range(n):
    grid[i] = [int(x) for x in input().split()]

visi = [[False] * n for _ in range(n)]

for i in range(0, n):
    recurCore(grid, i, 0, n)
    recurCore(grid, i, n - 1, n)


for i in range(0, n):
    recurCore(grid, 0, i, n)
    recurCore(grid, n-1, i, n)

for i in range(n):
    for j in range(n):
        if grid[i][j] == -1:
            grid[i][j] = 0
        elif grid[i][j] == 0:
            grid[i][j] = 2


def row2str(row):
    s = ''
    for a in row:
        s += str(a) + ' '
    return s[:-1]


for i in range(n):
    print(row2str(grid[i]))
#腾讯笔试##笔试题目##腾讯#
全部评论
并查集的思路是先把周围的含0的合并到同一个连通分量,然后遍历矩阵去合并右边和下边的相邻节点,若当前节点为0且相邻右边节点为0,就合并。若相邻下边节点为0,则合并。最后再次遍历一次矩阵,比较为0的节点 的father其与外围为0的节点的father是否相同,若不同,则该区域需要改写成2,即轰炸区。
1 回复 分享
发布于 2021-08-23 00:19

相关推荐

牛大宝儿236:还没入职就PUA,[发火我之前遇到一个月给500块钱的
点赞 评论 收藏
分享
05-20 02:34
已编辑
华中科技大学 游戏策划
ResourceUtilization:你是我见过最美丽的牛客女孩你的眼睛里面有星星
投递腾讯等公司6个岗位
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务