본문 바로가기

배열 돌리기 4 [17406] with 파이썬 본문

Algorithms/BFS and DFS

배열 돌리기 4 [17406] with 파이썬

Louisus 2020. 6. 5. 00:23
728x90

https://www.acmicpc.net/problem/17406

 

17406번: 배열 돌리기 4

크기가 N×M 크기인 배열 A가 있을때, 배열 A의 값은 각 행에 있는 모든 수의 합 중 최솟값을 의미한다. 배열 A가 아래와 같은 경우 1행의 합은 6, 2행의 합은 4, 3행의 합은 15이다. 따라서, 배열 A의

www.acmicpc.net

 

from copy import deepcopy

n
, m, k = map(int, input().split())
a = [
list(map(int, input().split())) for _ in range(n)]
q = [
list(map(int, input().split())) for _ in range(k)]

dx
, dy = [1,0,-1,0], [0,-1,0,1]
# 값으로 가정
ans = 10000

# 행의 가장 작은 결과 출력
def value(arr):
   
return min([sum(i) for i in arr])

def convert(arr, qry):
    r
, c, s = qry
   
# 중앙에서 시작해서 오른쪽 대각선 방향부터 시작
    #
배열의 기준 번호가 다르기 때문에 맞춰준다
   
r, c = r-1, c-1

   
new_arr = deepcopy(arr)
   
for i in range(1, s+1):
        rr
, cc = r-i, c+i
       
# 순으로 회전
       
for w in range(4):
           
for d in range(i*2):
                rrr
, ccc = rr+dx[w], cc + dy[w]
               
# 회전
               
new_arr[rrr][ccc] = arr[rr][cc]
               
# 다음값으로 바꿔줌
               
rr, cc = rrr, ccc
   
return new_arr

def dfs(arr, qry):
   
global ans

   
# 회전 시킨 경우
    # dfs
재귀 종료 시점
   
if sum(qry) == k:
        ans =
min(ans,value(arr))
       
return
   
    for
i in range(k):
       
if qry[i]:
           
continue
       
# 백트래킹 - 쿼리 처리했다하고 다시 쿼리 처리 안한 상태로 바꿈
       
new_arr = convert(arr, q[i])
        qry[i] =
1
       
dfs(new_arr, qry)
        qry[i] =
0

dfs(a, [0 for i in range(k)])
print(ans)

'Algorithms > BFS and DFS' 카테고리의 다른 글

가장 먼 노드 with 파이썬  (0) 2020.08.06
2048 (Easy) [12100] with 파이썬  (0) 2020.06.04
Mooyo Mooyo [16768] with 파이썬  (0) 2020.06.04
과외맨 [5213] with 파이썬  (0) 2020.06.02
바이러스 [2606] with 파이썬  (0) 2020.06.02
Comments