카테고리 없음

Swea D3 11760.최소합 Python Brute force, 재귀, 백트래킹

아크몽 2024. 2. 27. 22:48

 

'''
최소합 구하기
모든 경로를 구해서 구하거나, 짧은 경로로만 구하던가
'''

def brute_force(y,x):
    global result, sum_v
    if result < sum_v: # result가 이미 작으면 굳이 실행안해도 된다.
        return
    if y == n-1 and x == n-1: # 마지막 좌표에 다달았을 때
        result = sum_v
        return
    for dy,dx in dij:
        ny = y + dy
        nx = x + dx
        if 0 <= ny < n and 0 <= nx < n:
            sum_v += arr[ny][nx] # 탐색 전 더해보기
            brute_force(ny,nx) # 새 좌표로 탐색하기
            sum_v -= arr[ny][nx] # 탐색 끝났으니 빼기

t = int(input())
for tc in range(1,t+1):
    n = int(input())
    arr = [list(map(int,input().split())) for _ in range(n)]
    # print('#',tc)
    # for x in arr:
    #     print(x)

    dij = [[0, 1], [1, 0]]  # 오 아
    sum_v = arr[0][0] # 시작점
    result = 100 # 최대한 큰 값으로
    brute_force(0,0) # 0,0 부터 시작하니까...
    print(f'#{tc} {result}')

흔적

# for i in range(2*n-1): # 지나가는 총 횟수
#     # for j in range(n):
#     k_sum = 0
#     for k in range(2):
#         ni = dij[k][0]
#         nj = dij[k][1]
#         if 0 <= ni < n and 0 <= nj < n:
#             if k_sum < arr[ni][nj]:  # 0과 오른쪽 값 비교
#                 k_sum = arr[ni][nj]
#
#             elif k_sum > arr[ni][nj]:  # 오른쪽값과 아래 값 비교
#                 k_sum = arr[ni][nj]
#     sum_v += k_sum

# for i in range(n):
#     for j in range(n):