-
BOJ 17135 캐슬 디펜스(Python 3)알고리즘/BOJ 2019. 4. 8. 23:22반응형
https://www.acmicpc.net/problem/17135
일단 먼저 필요한 것이 combinations, deepcopy, deque, Max입니다.
combinations는 궁수가 어디에 위치하고 있는지 모르기 때문에 모든 경우의 수를 구하기 위해 불러왔습니다.
deepcopy는 원본 맵을 복사 하여 각 경우의 수마다 시뮬레이션을 돌려야 하기 때문에 맵의 수정이 필요하므로 불러왔습니다.
deque는 몬스터의 좌표를 저장할 때 쓰입니다.
Max는 공격할 수 있는 적이 여러 명일 때, 가장 왼쪽에 있는 적을 공격하기 위해서 만들었습니다. 이건 설정 안 해도 됩니다.
1234from itertools import combinationsfrom copy import deepcopyfrom collections import dequeMax = float('inf')cs main함수입니다.
여기서 따로 구현한 함수는 NOE와 Attack입니다.
12345678910111213141516n,m,d = map(int,input().split())D=[[*map(int,input().split())] for _ in range(n)]Castle = [i for i in range(m)]Archer = combinations(Castle,3)ans = 0q = deque()for S in Archer:Map = deepcopy(D)k = 0while 1:NOE()if len(q) == 0: breakAttack(q)Map = [[0]*m] + Map[:n-1] #아래로 한 칸 이동ans = max(ans,k)print(ans)cs NOE(number of enemies) 함수를 이용하여 적의 좌표를 전부 q에 넣습니다.
만약 적이 없다면 if len(q)==0: break 때문에 while루프에서 빠져나오게 됩니다.
12345def NOE():for i in range(n):for j in range(m):if Map[i][j]==1:q.append((i,j))cs Attack함수를 이용하여 각 궁수들이 공격할 좌표를 설정해주고 적을 공격합니다.
123456789101112131415161718def Attack(q):global ktarget = [(0,Max),(0,Max),(0,Max)]Dist = [Max,Max,Max]while q: #공격할 좌표 설정x,y = q.popleft()for i in range(3):z = abs(n-x) + abs(S[i]-y)if Dist[i] > z: # 좌표 갱신Dist[i] = ztarget[i] = (x,y)elif Dist[i] == z and y < target[i][1]: # 같은 거리일 때, 더 왼쪽에 있으면 좌표갱신target[i] = (x,y)for t,(x,y) in enumerate(target): #공격if Map[x][y] == 1:if Dist[t] <= d:Map[x][y] = 0k += 1cs 이렇게 해서 완성된 코드입니다.
1234567891011121314151617181920212223242526272829303132333435363738394041424344def NOE():for i in range(n):for j in range(m):if Map[i][j]==1:q.append((i,j))def Attack(q):global ktarget = [(0,Max),(0,Max),(0,Max)]Dist = [Max,Max,Max]while q:x,y = q.popleft()for i in range(3):z = abs(n-x) + abs(S[i]-y)if Dist[i] > z:Dist[i] = ztarget[i] = (x,y)elif Dist[i] == z and y < target[i][1]:target[i] = (x,y)for t,(x,y) in enumerate(target):if Map[x][y] == 1:if Dist[t] <= d:Map[x][y] = 0k += 1from itertools import combinationsfrom copy import deepcopyfrom collections import dequeMax=float('inf')n,m,d=map(int,input().split())D=[[*map(int,input().split())] for _ in range(n)]Castle=[i for i in range(m)]Archer=combinations(Castle,3)ans=0q=deque()for S in Archer:Map=deepcopy(D)k=0while 1:NOE()if len(q)==0: breakAttack(q)Map=[[0]*m]+Map[:n-1]ans=max(ans,k)print(ans)cs 반응형'알고리즘 > BOJ' 카테고리의 다른 글
BOJ 17069 파이프 옮기기 2(python 3) (0) 2019.04.11 BOJ 17070 파이프 옮기기 1(python 3) (0) 2019.04.11 BOJ 13905 세부(Python 3) (0) 2019.03.12 BOJ 1738 골목길(Python 3) (0) 2019.03.07 BOJ 1613 역사(Python 3) (0) 2019.02.23