문제
https://www.acmicpc.net/problem/17135
접근 방법
- 성에 3명의 궁수를 배치할수 있는 모든 경우의수 체크
- 가장 가까운 적 우선으로 잡음 ( 여러명이라면 가장 왼쪽 적 )
풀이 코드
from collections import deque
import copy
def BFS(can,cattle,r,c):
dd = (
(0,-1),
(-1,0),
(0,1)
)
for dr,dc in dd:
if not(0 <= r + dr < R and 0 <= c + dc < C):
continue
if cattle[r+dr][c+dc]:
can.append((r+dr, c+dc))
if (r+dr,c+dc) not in vis:
que.append((r+dr,c+dc))
vis.add((r+dr,c+dc))
return can
def archer(arr):
result = 0
ene = [()] * 3
cattle = copy.deepcopy(world)
for _ in range(raw):
for i in range(3):
can = [(-1,-1)]
que.clear()
vis.clear()
que.append((R,arr[i]))
vis.add((R,arr[i]))
d = 1
while que:
if d > D:
break
for _ in range(len(que)):
can = BFS(can,cattle,*que.popleft())
d += 1
vis.clear()
if len(can) > 1:
break
can.sort(key=lambda x:(x[1],x[0]))
if len(can) > 1:
ene[i] = can[1]
else:
ene[i] = can[0]
for r, c in ene:
if r != -1 and c != -1 and cattle[r][c]:
cattle[r][c] = 0
result += 1
cattle = [[0]*C] + cattle[:-1]
return result
R, C, D = map(int,input().split())
world = [0] * R
raw = 0
for r in range(R):
world[r] = list(map(int,input().split()))
if not raw and world[r].count(1):
raw = R - r
mx = 0
que = deque()
vis = set()
for one in range(C-2):
for two in range(one+1,C-1):
for three in range(two+1,C):
now = archer([one,two,three])
if mx < now:
mx = now
print(mx)