출처 : https://www.acmicpc.net/problem/17837
# 정리
k개의 말을 입력받는다.
각 말들을 1번부터 k번 말까지 순서대로 주어진 규칙에 따라 이동시킨다.
값이 리턴되는 경우의 수는 2가지이다.
1. 이동하려는 칸에 존재하는 체스말이 4개이상인 경우 → turn 횟수를 리턴한다.
2. turn 횟수가 1000을 넘기는 경우 → -1을 리턴한다.
이를 만족시킬 수 있을때까지 반복하면 된다.
# Code
def solve():
turn = 0
P = 0
while True:
turn += 1
if turn > 1000: return -1
for number in range(1, k+1):
x, y, d = horse[number]
nx, ny = x+dx[d], y+dy[d]
## 맵을 벗어나는 경우 or 이동하려는 칸이 파란색인 경우
if nx<0 or nx>=n or ny<0 or ny>=n or board[nx][ny] == Blue:
nd = rev_direction[d]
nx, ny = x+dx[nd], y+dy[nd]
## 가만히 있는 경우(방향만 바뀐다.)
if nx<0 or nx>=n or ny<0 or ny>=n or board[nx][ny] == Blue:
horse[number][2] = nd
continue
P = 1
## 이동하려는 칸이 흰색인 경우
if board[nx][ny] == White:
left = board_2[(x, y)][:board_2[(x, y)].index(number)]
right = board_2[(x, y)][board_2[(x, y)].index(number):]
board_2[(x, y)] = left
board_2[(nx, ny)].extend(right)
if len(board_2[(nx, ny)]) >= 4: return turn
for i in right:
horse[i][0], horse[i][1] = nx, ny
if P==1: horse[number][2] = nd; P=0
## 이동하려는 칸이 빨간색인 경우
elif board[nx][ny] == Red:
left = board_2[(x, y)][:board_2[(x, y)].index(number)]
right = board_2[(x, y)][board_2[(x, y)].index(number):]
board_2[(x, y)] = left
right.reverse()
board_2[(nx, ny)].extend(right)
if len(board_2[(nx, ny)]) >= 4: return turn
for i in right:
horse[i][0], horse[i][1] = nx, ny
if P==1: horse[number][2] = nd; P=0
if __name__ == '__main__':
n, k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
horse = dict()
board_2 = {(i, j):[] for j in range(n) for i in range(n)}
for i in range(1, k+1):
x, y, d = map(int, input().split())
horse[i] = [x-1, y-1, d-1]
board_2[(x-1, y-1)].append(i)
White = 0
Red = 1
Blue = 2
# 동, 서, 북, 남
dx = (0, 0, -1, 1)
dy = (1, -1, 0, 0)
rev_direction = {0:1, 1:0, 2:3, 3:2}
print(solve())
|
cs |
'알고리즘 > [Python] 백준' 카테고리의 다른 글
[Python] 백준 2933번: 미네랄 (0) | 2020.05.03 |
---|---|
[Python] 백준 17822번: 원판 돌리기 (0) | 2020.04.24 |
[Python] 백준 17140번: 이차원 배열과 연산 (0) | 2020.04.19 |
[Python] 백준 1987번: 알파벳 (0) | 2020.04.19 |
(Python) 백준 17143번: 낚시왕 (0) | 2020.03.28 |