:question:문제 설명

숫자가 쓰여있는 $m \times n$ 크기의 배열이 주어지고 칸을 자 모양을 뒤집거나 회전 시킨 아이들로 채웠을 때 덮어지는 수들의 최대합을 구하기

:pencil2:코드

import sys
input = sys.stdin.readline


def solve(r, c, value):
    global max_v

    if c == m:
        r += 1
        c = 0

    if r == n:
        if max_v < value:
            max_v = value
        return

    if not visited[r][c]:
        for k in range(4):
            if k == 0:
                nr, nc = r + 1, c - 1
            elif k == 1:
                nr, nc = r - 1, c - 1
            elif k == 2:
                nr, nc = r - 1, c + 1
            elif k == 3:
                nr, nc = r + 1, c + 1

            if 0 <= nr < n and 0 <= nc < m:
                if not visited[nr][c] and not visited[r][nc]:
                    visited[r][c] = True
                    visited[nr][c] = True
                    visited[r][nc] = True
                    solve(r, c + 1, value + 2 * arr[r][c] + arr[nr][c] + arr[r][nc])
                    visited[r][c] = False
                    visited[nr][c] = False
                    visited[r][nc] = False
    solve(r, c + 1, value)

    return


n, m = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]
visited = [[False]* m for _ in range(n)]
max_v = 0
solve(0, 0, 0)
print(max_v)

:memo:풀이

아침 코딩스터디 때 다루었던 문제인데 모든 칸을 재귀적으로 탐색하는 방법을 처음 알았다! 열의 인덱스만 1씩 증가시켜주고 열의 인덱스 범위가 초과 했을 때 행 인덱스를 1 증가시켜주고 열 인덱스는 0으로 초기화 시켜준다. 이렇게하면 모든 칸에 대해서 탐색을 할 수 있다.

댓글남기기