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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | import sys from copy import deepcopy n, m = map(int, sys.stdin.readline().split()) board = [list(map(int, sys.stdin.readline().split())) for c in range(n)] def up(temp_board, r, c): count = 1 for i in range(r, -1, -1): if temp_board[i][c] == 6: break temp_board[i][c] = -1 return count def right(temp_board, r, c): count = 1 for j in range(c, m, 1): if temp_board[r][j] == 6: break temp_board[r][j] = -1 return count def down(temp_board, r, c): count = 1 for i in range(r, n, 1): if temp_board[i][c] == 6: break temp_board[i][c] = -1 return count def left(temp_board, r, c): count = 1 for j in range(c, -1, -1): if temp_board[r][j] == 6: break temp_board[r][j] = -1 return count def solution(idx, obs_list): global answer temp_board = deepcopy(board) if idx == list_size: # count all detection area for ((r, c), observer, offset) in obs_list: if observer == 1: if offset == 0: right(temp_board, r, c) elif offset == 1: down(temp_board, r, c) elif offset == 2: left(temp_board, r, c) else: up(temp_board, r, c) elif observer == 2: if offset == 0 or offset == 2: right(temp_board, r, c) left(temp_board, r, c) elif offset == 1 or offset == 3: up(temp_board, r, c) down(temp_board, r, c) elif observer == 3: if offset == 0: up(temp_board, r, c) right(temp_board, r, c) elif offset == 1: right(temp_board, r, c) down(temp_board, r, c) elif offset == 2: down(temp_board, r, c) left(temp_board, r, c) else: left(temp_board, r, c) up(temp_board, r, c) elif observer == 4: if offset == 0: up(temp_board, r, c) right(temp_board, r, c) down(temp_board, r, c) elif offset == 1: right(temp_board, r, c) down(temp_board, r, c) left(temp_board, r, c) elif offset == 2: down(temp_board, r, c) left(temp_board, r, c) up(temp_board, r, c) else: left(temp_board, r, c) up(temp_board, r, c) right(temp_board, r, c) else: up(temp_board, r, c) right(temp_board, r, c) left(temp_board, r, c) down(temp_board, r, c) # get the minimum space count = 0 for r in range(n): for c in range(m): if temp_board[r][c] == 0: count += 1 answer = min(answer, count) return answer # traverse all occasion for i in range(4): obs_list[idx][2] = i solution(idx + 1, obs_list) # make a list of observers observer_list, list_size = list(), 0 for i in range(n): for j in range(m): if 0 < board[i][j] < 6: observer_list.append([(i, j), board[i][j], 0]) list_size += 1 answer = sys.maxsize solution(0, observer_list) print(answer) | cs |