|
| 1 | +import os |
| 2 | +import sys |
| 3 | + |
| 4 | +sys.stdin = open( |
| 5 | + os.path.join("/", *__file__.split("/")[:-1], "sample_input.txt"), "r" |
| 6 | +) |
| 7 | + |
| 8 | +# https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5-BEE6AK0DFAVl |
| 9 | + |
| 10 | + |
| 11 | +from collections import deque |
| 12 | + |
| 13 | + |
| 14 | +def takes(selected: int): |
| 15 | + dists_to_0, dists_to_1 = [], [] |
| 16 | + for idx in range(len(people))[::-1]: |
| 17 | + uses0 = selected & 1 |
| 18 | + if uses0: |
| 19 | + dists_to_0.append(dists[idx][0]) |
| 20 | + else: |
| 21 | + dists_to_1.append(dists[idx][1]) |
| 22 | + selected >>= 1 |
| 23 | + |
| 24 | + dists_to_0, dists_to_1 = sorted(dists_to_0), sorted(dists_to_1) |
| 25 | + |
| 26 | + q0 = deque([], maxlen=3) |
| 27 | + for dist_to_0 in dists_to_0: |
| 28 | + if len(q0) == 3: |
| 29 | + q0.append(max(dist_to_0 + 1, q0[0]) + stairs[0][2]) |
| 30 | + else: |
| 31 | + q0.append(dist_to_0 + 1 + stairs[0][2]) |
| 32 | + |
| 33 | + q1 = deque([], maxlen=3) |
| 34 | + for dist_to_1 in dists_to_1: |
| 35 | + if len(q1) == 3: |
| 36 | + q1.append(max(dist_to_1 + 1, q1[0]) + stairs[1][2]) |
| 37 | + else: |
| 38 | + q1.append(dist_to_1 + 1 + stairs[1][2]) |
| 39 | + |
| 40 | + return max(max(q0, default=0), max(q1, default=0)) |
| 41 | + |
| 42 | + |
| 43 | +def select(idx: int = 0, selected: int = 0): |
| 44 | + if idx == len(people): |
| 45 | + return takes(selected) |
| 46 | + return min( |
| 47 | + select(idx + 1, selected), select(idx + 1, selected | (1 << idx)) |
| 48 | + ) |
| 49 | + |
| 50 | + |
| 51 | +for t in range(1, int(input()) + 1): |
| 52 | + n = int(input()) |
| 53 | + people = [] |
| 54 | + stairs = [] |
| 55 | + for r in range(n): |
| 56 | + for c, v in enumerate(list(map(int, input().split()))): |
| 57 | + if not v: |
| 58 | + continue |
| 59 | + if v == 1: |
| 60 | + people.append((r, c)) |
| 61 | + else: |
| 62 | + stairs.append((r, c, v)) |
| 63 | + |
| 64 | + dists = [ |
| 65 | + ( |
| 66 | + abs(r - stairs[0][0]) + abs(c - stairs[0][1]), |
| 67 | + abs(r - stairs[1][0]) + abs(c - stairs[1][1]), |
| 68 | + ) |
| 69 | + for r, c in people |
| 70 | + ] |
| 71 | + |
| 72 | + print(f"#{t} {select()}") |
0 commit comments