2차원 배열 백트래킹 문제 푸는데


알고리즘을 이렇게 짰음

1. src라는 판을 i 값에 따라서 0도(기본), 90도, 180도, 270도로 회전함

1.1 회전은 rotating() 함수에서 tmp 배열을 선언한 뒤 원본 배열의 값들을 넣어주고 tmp 배열을 반환함

2. 반환된 tmp배열을 가지고 기울이는 swiping() 함수 실행 (기울이는 동작)

3. 결과가 안 나오면 그 다음 차시 진행


근데 매 회전마다 원본 배열을 매개변수로 넣어주면서 rotating() 함수를 돌리는데, 이전 회전 결과값이 그대로 그 다음 회전으로 들어가더라고

그러니까 원본 배열 자체가 바뀜;;


내가 생각했을 때는 이게 rotating 함수에서 tmp 배열을 선언했고, 그냥 인덱스에 따라서 값만 원본 배열을 참조한거니까 깊은 복사가 된거라고 생각하는데

왜 이게 원본 배열에도 영향을 미침??

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
def swiping(arr):
    h, w = len(arr), len(arr[0])
    ind = 0
    goal = []
    forin range(h):
        forin range(w):
            if arr[x][y] == '#':
                ind = y+1
            elif arr[x][y] in ['R''B']:
                if 'O' in arr[x][ind:y+1]:
                    goal.append(arr[x][y])
                    arr[x][y] = '.'
                else:
                    arr[x][ind], arr[x][y] = arr[x][y], arr[x][ind]
                    ind += 1
            if goal:
                if 'B' in goal:
                    return 2
                elif 'R' in goal:
                    return 1
 
def rotating(arr, direction):
    global n, m
    if direction == 0:
        return arr
    elif direction == 1:
        tmp = [[0]*forin range(m)]
        forin range(m):
            forin range(n):
                tmp[x][y] = arr[y][m-1-x]
    elif direction == 2:
        tmp = [[0]*forin range(n)]
        forin range(n):
            forin range(m):
                tmp[x][y] = arr[n-1-x][m-1-y]
    else:
        tmp = [[0]*forin range(m)]
        forin range(m):
            forin range(n):
                tmp[x][y] = arr[n-1-y][x]
    return tmp
 
def backtracking(k, baseArr):
    global n, m, res
    if== 10:
        return
 
    forin range(4):
        tmpArr = rotating(baseArr, i)
        result = swiping(tmpArr)
        q[k] = i
        if result == 1:
            if res == -1 or res > k+1:
                res = k+1
            return
        elif result == 2:
            return
        else:
            backtracking(k+1, tmpArr)
        q[k] = -1
 
n, m = map(int, input().split())
 
src = [list(input()) forin range(n)]
res = -1
= [-1]*11
 
backtracking(0, src)
 
print(res)
cs