题解 | 取数游戏

取数游戏

https://www.nowcoder.com/practice/b002b8eb564245fdbb8a02db8dcf03e4

dx = [-1,-1,-1,0,0,1,1,1]
dy = [-1,0,1,-1,1,-1,0,1]

def in_bound(x:int, y:int, N:int, M:int):
    return 0 <= x < N and 0 <= y < M

def dfs(N:int, M:int, maze:list, used:list, curr_sum:int, start:int):
    global max_num
    flag = True
    for pos in range(start, N*M):
        i, j = divmod(pos, M)
        # 找到下一个没被用到的点
        if used[i][j] == -1:
            flag = False
            # 选中的点记为1
            used[i][j] = 1
            blocked = []
            # 周边点记为0
            for k in range(8):
                nx = i + dx[k]
                ny = j + dy[k]
                if in_bound(nx, ny, N, M) and used[nx][ny] == -1:
                    used[nx][ny] = 0
                    blocked.append((nx, ny))
            # 继续寻找
            dfs(N, M, maze, used, curr_sum + maze[i][j], pos + 1)
            # 回溯状态
            used[i][j] = -1
            for x, y in blocked:
                used[x][y] = -1
    if flag:
		# 没有点能再加入了
        max_num = max(max_num, curr_sum)

def calculate_num(N: int, M: int, maze: list):
    global max_num
    used = [[-1]*M for _ in range(N)]
    max_num = 0
    dfs(N, M, maze, used, 0, 0)
    return max_num

T = int(input())
for _ in range(T):
    N, M = map(int, input().split())
    maze = [list(map(int, input().split())) for _ in range(N)]
    print(calculate_num(N, M, maze))

全部评论

相关推荐

10-10 16:30
济宁学院 Java
一表renzha:面试官:蓝桥杯三等奖?你多去两次厕所都能拿二等吧
点赞 评论 收藏
分享
昨天 13:49
南京大学 财务
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务