|
| 1 | +import sys |
| 2 | +import copy |
| 3 | + |
| 4 | +input = sys.stdin.readline |
| 5 | + |
| 6 | + |
| 7 | +def flip(coins, line): |
| 8 | + for x, y in line: |
| 9 | + coins[x][y] = 'T' if coins[x][y] == 'H' else 'H' |
| 10 | + |
| 11 | + |
| 12 | +def dfs(coins, lines, idx, count, min_count): |
| 13 | + flat = sum(coins, []) |
| 14 | + if flat.count('T') == 9 or flat.count('H') == 9: |
| 15 | + return min(count, min_count) |
| 16 | + if idx == len(lines): # 더이상 뒤집을 줄이 없을 때 |
| 17 | + return min_count |
| 18 | + |
| 19 | + result = dfs(copy.deepcopy(coins), lines, idx+1, count, min_count) # 뒤집지 않고 다음 줄로 넘기는 경우 |
| 20 | + |
| 21 | + # 뒤집고 넘기는 경우 |
| 22 | + flipped = copy.deepcopy(coins) |
| 23 | + flip(flipped, lines[idx]) |
| 24 | + result = min(result, dfs(flipped, lines, idx+1, count+1, min_count)) |
| 25 | + |
| 26 | + return result |
| 27 | + |
| 28 | +row_lines = [[(i, j) for j in range(3)] for i in range(3)] |
| 29 | +col_lines = [[(j, i) for j in range(3)] for i in range(3)] |
| 30 | +diag_lines = [[(i, i) for i in range(3)], [(i, 2 - i) for i in range(3)]] |
| 31 | +lines = row_lines + col_lines + diag_lines # 나올 수 있는 모든 경우의 수 |
| 32 | + |
| 33 | +t = int(input()) |
| 34 | +for _ in range(t): |
| 35 | + coins = [] |
| 36 | + for _ in range(3): |
| 37 | + coins.append(list(input().split())) |
| 38 | + res = dfs(coins, lines, 0, 0, float('inf')) |
| 39 | + if res != float('inf'): |
| 40 | + print(res) |
| 41 | + else: |
| 42 | + print(-1) |
0 commit comments