- ๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ๊ณณ์ ๋ชจ๋ ๋ฐฐ์์ก์ ๋ฟ๋ฆฐ๋ค
- ๋ฐฐ์์ก์ ๊ฐ๊ฐ 1์นธ์ฉ ์ํ์ข์ฐ๋ก ํผ์ง ์ ์๋ค
- ์๋ก ๋ค๋ฅธ ์์ ๋ฐฐ์์ก์ด ๋์์ ๋์ฐฉํ๋ ์นธ์ ๊ฝ์ด ํ๋ค
- ๊ฝ์ด ํ ์นธ์ ๋ ์ด์ ํผ์ง์ง ์๋๋ค
- ํธ์์๋ ๋ฐฐ์์ก์ด ํผ์ง ์ ์๋ค
๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ์นธ K(<=10)์นธ ์ค์์ (R+G)์นธ๋ง ๊ณจ๋ผ๋ด๋ ์ค๋ณต์กฐํฉ์ด๋ค. ์ต๋ 10์นธ๊น์ง ์กด์ฌํ ์ ์๊ณ R๊ณผ G๋ ๊ฐ๊ฐ ์ต๋ 5์นธ์ด๋ฏ๋ก 10!/(5!x5!) = 252๊ฐ์ง๊ฐ ์ต๋๋ก ์กด์ฌํ ์ ์๋ค. ๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด ๊ตฌํ๊ณ ๊ฐ๊ฐ์ ๋ํด ๊ฐ ๋ฐฐ์์ก์ด ํผ์ก์ ๋์ ๊ฒฐ๊ณผ์ ๋ํด ๊ตฌํ๋ฉด ๋๋ค.
๊ฐ์ ์๊ฐ์ ๊ฐ์ ์นธ์ ๋์ฐฉํ ๊ฒฝ์ฐ์ ๋ํด ๊ตฌํด์ผ ํ๋ฏ๋ก ๋๋น์ฐ์ ํ์์ ์ฌ์ฉํ๋ค. ์ด๋ก์๊ณผ ๋นจ๊ฐ์์ ๋ฐฐ์์ก์ ๋ํด ๊ฐ๊ฐ ๊ตฌ๋ถํด์ผ ํ๋ค. ์ด๋, ๋น์นธ์ ๋๋ฌํ๋ค๋ฉด ๋๋ฌํ ๋ฐฐ์์ก์ ๋ฐ๋ก ์ ์ฅํ์ง๋ง, ์ด๋ก์ ๋ฐฐ์์ก์ผ ๋ ๋นจ๊ฐ์ ์นธ์ด๊ฑฐ๋, ๋นจ๊ฐ์ ๋ฐฐ์์ก์ผ ๋ ์ด๋ก์ ์นธ์ด๋ผ๋ฉด ๊ฐ ๋๋ฌ์๊ฐ์ ๋น๊ตํด์ผ ํ๋ค. ๋๋ฌํ ์๊ฐ์ด ๋์ผํ๋ค๋ฉด ๊ฝ์ ํผ์ฐ๊ณ ๊ทธ๋ ์ง ์๋ค๋ฉด ๊ทธ๋ฅ ์ง๋๊ฐ๋ค.
์ด๋ ์ฃผ์ํด์ผ ํ ์ ์, ๋ง์ฝ ํน์ ๋ฐฐ์์ก์ด ๋๋ฌํ์ ๋ ๋น์นธ์ด์์ผ๋ ๋ค์ด์ด ๋ค๋ฅธ ์์ ๋ฐฐ์์ก์ด ๊ทธ ์นธ์ ๋์์ ๋๋ฌํ๊ฒ ๋์์ ๋๋ ํ์์ ์ํด ํ์ ์ด๋ฏธ ์ถ๊ฐ๋ ์นธ์ด ๋์ค์ ๊ฝ์ด ๋์ด๋ฒ๋ฆฐ ๊ฒฝ์ฐ์ด๋ฏ๋ก ์ด ์นธ์ ํ์์ ์ค๋จ์์ผ์ผ ํ๋ค. ์๋ฅผ ๋ค์ด ์ด๋ก์ ๋ฐฐ์์ก์ด ํน์ ์นธ์ ๋๋ฌํ์ ๋๋ ๋น์ด์์ด์ ์ด๋ก์ ์นธ์ผ๋ก ๋ฌผ๋ค์ด๊ณ ๋ค์ด์ ํ์์ ์ํด ํ์ ์ถ๊ฐ๊น์ง ํ๋๋ฐ ๋ค์ด์ด ๋นจ๊ฐ์ ๋ฐฐ์์ก์ด ๊ฐ์ ์๊ฐ์ด ๋๋ฌํด๋ฒ๋ฆฌ๋ฉด ํ์ ์ถ๊ฐํ๋ ๊ทธ ์นธ์ ๊ฝ์ด ๋์๊ธฐ ๋๋ฌธ์ ํ์์ ๊บผ๋์ ๋ ํ์์ ํ๋ฉด ์ ๋๋ ๊ฒ์ด๋ค. ์ด๊ฑธ ๋ชฐ๋ผ์ ์์ฒญ ํค๋งธ๋ค.
์ฐธ๊ณ ๋ก Python3๋ก๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
# Gaaaaaaaaaarden
# ๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ๋
์ฐพ๊ธฐ
def find_land(arr):
queue = []
for i in range(n):
for j in range(m):
if arr[i][j] == 2:
queue.append((i, j))
return queue
# ๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ์ค๋ณต์กฐํฉ ๊ตฌํ๊ธฐ
def dfs(i, k, tmp, lst, comb):
if len(tmp) == k:
comb.append(tmp[:])
return comb
for j in range(i, len(lst)):
if lst[j] not in tmp:
tmp.append(lst[j])
comb = dfs(j+1, k, tmp, lst, [row[:] for row in comb])
tmp.remove(lst[j])
return comb
# ๋ฐฐ์์ก ํผ๋จ๋ฆฌ๊ธฐ
def bfs(green, red, medium_land):
arr = [[[0, 0] for _ in range(m)] for _ in range(n)]
queue = []
for i in green:
gx, gy = medium_land[i]
arr[gx][gy] = [GREEN, 0]
queue.append((gx, gy))
for j in red:
rx, ry = medium_land[j]
arr[rx][ry] = [RED, 0]
queue.append((rx, ry))
flowers = 0
while queue:
x, y = queue.pop(0)
# ํ์ฌ ํ์ํ๋ ค๋ ์นธ์ด ์ด๋ฏธ ๊ฝ์ด๋ผ๋ฉด ํ์ ๋ถ๊ฐ
if arr[x][y][0] == FLOWER:
continue
count = arr[x][y][1]
for nx, ny in (x-1, y), (x+1, y), (x, y-1), (x, y+1):
# ๋ฒ์์ ์ํ์ง ์๊ฑฐ๋ ํธ์์ด๊ฑฐ๋ ๊ฐ์ ์์ ๋ฐฐ์์ก์ด๊ฑฐ๋ ๊ฝ์ธ ๊ฒฝ์ฐ
if not(-1<nx<n and -1<ny<m) or land[nx][ny] == 0 or arr[nx][ny][0] in (arr[x][y][0], 3):
continue
if arr[x][y][0] == GREEN:
if arr[nx][ny][0] == RED and arr[nx][ny][1] == count+1:
arr[nx][ny][0] = FLOWER
flowers += 1
elif arr[x][y][0] == RED:
if arr[nx][ny][0] == GREEN and arr[nx][ny][1] == count+1:
arr[nx][ny][0] = FLOWER
flowers += 1
if arr[nx][ny][0] == EMPTY:
arr[nx][ny] = [arr[x][y][0], count+1]
queue.append((nx, ny))
return flowers
n, m, g, r = map(int, input().split())
land = [list(map(int, input().split())) for _ in range(n)]
medium_land = find_land(land)
combs, lst, max_result = [], range(len(medium_land)), 0
EMPTY, GREEN, RED, FLOWER = 0, 1, 2, 3
for green in dfs(0, g, [], lst, []):
for red in dfs(0, r, [], [row for row in lst if row not in green], []):
max_result = max(max_result, bfs(green, red, medium_land))
print(max_result)