ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฌธ์
๋ฌธ์ ํ์ด
๋ฌธ์ ์ ์๊ตฌ์์ ๊ทธ๋๋ก ๊ตฌํํ๋ฉด ๋๋ค. ๋น์ทํ ์๋ฎฌ๋ ์ด์ ๋ฌธ์ ๋ก๋ ์ด๋ฅธ ์์ด์ด์ง ์์๊น ์ถ๋ค. ์ด์ ์ ๋ค๋ฃฌ ๋ฌธ์ ๋ณด๋ค ๊น๋ค๋ก์ด ๊ฒ์ ์ฒด์ค ๋ง์ด ์ค์ฒฉ๋๋ ๊ฒฝ์ฐ, ๊ทธ๋๋ก ์์ธ๋ค๋ ๊ฒ์ด๋ค. ๋ํ ์ด๋ํ ๋ ํ์ฌ ์ฒด์ค ๋ง์ ๋ฒํธ์ ์์ธ ์ฒด์ค ๋ง๋ค์ ํ๋จํ์ฌ์ ์ด๋์์ผ์ผ ํ๋ค๋ ๊ฒ์ด ๋ฌ๋๋ค. ์ฌ๊ธฐ์ ์ด๊ธฐ์ ์ฃผ์ด์ง๋ ์ ๋ณด์ ํฐ์, ๋นจ๊ฐ์, ํ๋์์ ์๊น์ด ๊ตฌ๋ถ๋๋ ์นธ์ด ์ฃผ์ด์ง๋ฉด ๊ฐ ์นธ๋ค์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํ์ฌ์ผ ํ๋ค.
- ํฐ์์ธ ๊ฒฝ์ฐ ๊ทธ๋๋ก ์ด๋ํ๋ค.
- ๋นจ๊ฐ์์ธ ๊ฒฝ์ฐ ์ด๋ํ๋ ค๋ ๋ง์ ๋ค์ง์ด์ ์ด๋ํ๋ค.
- ์๋ฅผ ๋ค์ด ์ด๋ํ๋ ค๋ ์นธ์ A, B, C๊ฐ ์๋ค๋ฉด C, B, A ๊ฐ ๋๋ค.
- ํ๋์๊ณผ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ์๋ ๋ฐฉํฅ์ ๋ฐ๋๋ก ๋ฐ๊พผ๋ค.
- ๋ฐฉํฅ์ ๋ฐ๋๋ก ๋ฐ๊พผ ํ์๋ ๋์ผํ ์ํฉ์ด ๋ฐ์(ํ๋์ or ๋ฒ์๋ฅผ ๋ฒ์ด๋จ)ํ๋ค๋ฉด, ๊ฐ๋งํ ์๋๋ค.
์์ ์ํฉ๋ค์ ์ ๊ณ ๋ คํ์ฌ์ ๊ทธ๋๋ก ์ฝ๋๋ก ์์ฑํ๋ฉด ๋๋ค. ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์ ๋ชป ์๊ฐํ๋ ๋ถ๋ถ์ ์ค์ฒฉ๋ ๊ฒฝ์ฐ ํ ๋ฒ์ ์ด๋์ํค๋ฉด ๋๋ค๊ณ ์๊ฐํ์๋ค. (์ฌ์ค, ๊ทธ๋ฆผ ์์ ๋ฅผ ์์ธํ ์ ๋ณด๊ณ ๋ฌธ์ ๋ฅผ ํ์๋ค.๐ฅ) ์๊ฐํ ๋ฐ๋ก ์์ฑํ๋๋ฐ ํ๋ ธ์ต๋๋ค๊ฐ ๊ณ์ ๋์์ ์ฐพ์๋ณด๋ ํ์ฌ ์ด๋ํ๋ ค๋ ๋ง ๋ฒํธ๋ณด๋ค ์์ ์๋ ๊ฒ์ ๊ฐ์ด ์์ง์ด๊ณ , ์๋์ ์๋ ๊ฒ์ ๊ทธ๋๋ก ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์์๋ค. ์ด ์ญ์ ๊ทธ๋๋ก ์์ฑํ๋ฉด ๋ฌธ์ ์ ์ ๋ต์ ์ฐพ์ ์ ์๋ค.
์ฝ๋
from sys import stdin
RED, BLUE = 1, 2
def visitable(r, c):
return 0 <= r < N and 0 <= c < N
def move_cp(cp_idx):
r, c, cur_dir = cp_loc[cp_idx]
dr, dc = dirs[cur_dir]
next_r, next_c = r + dr, c + dc
if not visitable(next_r, next_c) or board[next_r][next_c] == BLUE:
dr, dc = dirs[reversed_dir[cur_dir]]
next_r, next_c = r + dr, c + dc
# ๋ฐฉํฅ๋ง ๋ฐ๋๋ก ๋ณ๊ฒฝ
cp_loc[cp_idx][2] = reversed_dir[cur_dir]
if not visitable(next_r, next_c) or board[next_r][next_c] == BLUE:
return False
# ๊ฒน์ณ์ง๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ์ฌ, ์ ์๋ ๋ง๋ค์ ํ๋ณํ์ฌ์ผ ํจ
idx = check[r][c].index(cp_idx)
temp = check[r][c][idx:]
check[r][c] = check[r][c][:idx]
# ๋นจ๊ฐ์์ธ ๊ฒฝ์ฐ ๋ค์ง์
if board[next_r][next_c] == RED:
temp = temp[::-1]
# ์์น ์ ๋ณด๋ฅผ ํ๋์ฉ ๋ณ๊ฒฝ
for cp_idx in temp:
check[next_r][next_c].append(cp_idx)
cp_loc[cp_idx][:2] = [next_r, next_c]
return len(check[next_r][next_c]) >= 4
if __name__ == '__main__':
# ์ฐ, ์ข, ์, ํ
dirs = ((0, 1), (0, -1), (-1, 0), (1, 0))
reversed_dir = {0: 1, 1: 0, 2: 3, 3: 2}
N, K = map(int, stdin.readline().split())
board = [list(map(int, stdin.readline().split())) for _ in range(N)]
check = [[[] for _ in range(N)] for _ in range(N)]
# chase piece location
cp_loc = [list(map(int, stdin.readline().split())) for _ in range(K)]
# ์ธ๋ฑ์ค์ ๋ง๊ฒ 1์ฉ ๊ฐ์
for idx, cp in enumerate(cp_loc):
x, y, cur_dir = cp
cp_loc[idx] = [x - 1, y - 1, cur_dir - 1]
check[x - 1][y - 1].append(idx)
time = 1
while time <= 1000:
for i in range(K):
if move_cp(i):
print(time)
exit(0)
time += 1
print(-1)
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 21610 ๋ง๋ฒ์ฌ ์์ด์ ๋น๋ฐ๋ผ๊ธฐ (2) | 2021.04.28 |
---|---|
๋ฐฑ์ค: 17822 ์ํ ๋๋ฆฌ๊ธฐ (0) | 2021.04.19 |
๋ฐฑ์ค: 19237 ์ด๋ฅธ ์์ด (0) | 2021.04.17 |
๋ฐฑ์ค: 17779 ๊ฒ๋ฆฌ๋ฉ๋๋ง 2 (0) | 2021.04.16 |
๋ฐฑ์ค: 19238 ์คํํธ ํ์ (0) | 2021.04.15 |