Title: 강력한 폭발, Time: 46ms, Memory: 16MB, Status: Wrong Answer - Codetree
This commit is contained in:
70
251102/강력한 폭발/strong-explosion.py
Normal file
70
251102/강력한 폭발/strong-explosion.py
Normal file
@@ -0,0 +1,70 @@
|
||||
n = int(input())
|
||||
grid = [list(map(int, input().split())) for _ in range(n)]
|
||||
|
||||
# Please write your code here.
|
||||
|
||||
def bomb_type1(x, y):
|
||||
coords = {(x, y)}
|
||||
for dy in [-2, -1, 1, 2]:
|
||||
ny = y + dy
|
||||
if 0 <= ny < n:
|
||||
coords.add((x, ny))
|
||||
return coords
|
||||
|
||||
def bomb_type2(x, y):
|
||||
coords = {(x, y)}
|
||||
for dx, dy in [(1,0), (-1, 0),(0, 1),(0,-1)]:
|
||||
nx = x + dx
|
||||
ny = y + dy
|
||||
if 0 <= nx <= n and 0 <= ny < n:
|
||||
coords.add((nx, ny))
|
||||
return coords
|
||||
|
||||
def bomb_type3(x, y):
|
||||
coords = {(x, y)}
|
||||
for dx, dy in [(-1, 1), (-1, -1), (1, 1), (1, -1)]:
|
||||
nx = x + dx
|
||||
ny = y + dy
|
||||
if 0 <= nx <= n and 0 <= ny < n:
|
||||
coords.add((nx, ny))
|
||||
return coords
|
||||
|
||||
bomb_loc = []
|
||||
|
||||
for i in range(n):
|
||||
for j in range(n):
|
||||
if grid[i][j] == 1:
|
||||
bomb_loc.append((i, j))
|
||||
|
||||
from itertools import product
|
||||
|
||||
max_area = 0
|
||||
|
||||
def backtrack(idx, destroyed_set):
|
||||
global max_area
|
||||
|
||||
# 모든 폭탄에 대해 타입을 선택했으면
|
||||
if idx == len(bomb_loc):
|
||||
max_area = max(max_area, len(destroyed_set))
|
||||
return
|
||||
|
||||
# 현재 폭탄의 위치
|
||||
y, x = bomb_loc[idx] # (행, 열) = (y, x)
|
||||
|
||||
# 3가지 폭탄 타입 시도
|
||||
for bomb_func in [bomb_type1, bomb_type2, bomb_type3]:
|
||||
# 현재 폭탄으로 초토화되는 좌표들
|
||||
new_coords = bomb_func(x, y)
|
||||
|
||||
# 기존 set에 합치기
|
||||
new_destroyed = destroyed_set | new_coords
|
||||
|
||||
# 다음 폭탄으로 진행
|
||||
backtrack(idx + 1, new_destroyed)
|
||||
|
||||
# 백트래킹 시작
|
||||
backtrack(0, set())
|
||||
|
||||
print(max_area)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user