[BOJ] 17143λ²: λμμ
https://www.acmicpc.net/problem/17143
17143λ²: λμμ
λμμμ΄ μμ΄ λμλ₯Ό νλ κ³³μ ν¬κΈ°κ° R×CμΈ κ²©μνμΌλ‘ λνλΌ μ μλ€. 격μνμ κ° μΉΈμ (r, c)λ‘ λνλΌ μ μλ€. rμ ν, cλ μ΄μ΄κ³ , (R, C)λ μλ κ·Έλ¦Όμμ κ°μ₯ μ€λ₯Έμͺ½ μλμ μλ μΉΈμ΄λ€.
www.acmicpc.net
λ¬Έμ ν΄κ²°
1. λ¬Έμ λ λμμμ΄ Cλ§νΌ μ΄λνλ©΄ λλκΈ° λλ¬Έμ 1) μ€λ₯Έμͺ½μΌλ‘ ν μΉΈ μ΄λν ν λμ 2) μμ΄ μ΄λ μ΄κ±Έ Cλ§νΌ λ°λ³΅ν΄μ£Όλ©΄ λλ€.
2. λμλ₯Ό ν λ κ·Έ μ΄μμ κ°κΉμ΄ νμ μμ΄κ° μμΌλ©΄ μ‘κ³ λμ μμ΄λ₯Ό μ κ±°ν΄μ£Όλ©΄ λλ€. (board[r][c] = 0 μμ νμ)
3. λμκ° λλ¬μΌλ©΄ μ΄λμ ν΄μ£Όλ©΄ λλλ°, μ΄ λΆλΆμ΄ μ μΌ κ³ λ―Όμ΄ λ§μ΄ λλ€. μ²μμ 2μ€ forλ¬ΈμΌλ‘ boardμ κ°μ΄ μμΌλ©΄ μλ ₯λ§νΌ μ΄λν΄μ£Όλ €κ³ νλλ° κ·Έλ¬λ©΄ 3μ€ ν¬λ¬Έμ΄ λλ€. μκ° μ΄κ³Όκ° κ±±μ λλ€.
μλ ₯μ΄λ νμ¬ μμΉλ₯Ό κ°μ§κ³ κ³μ°μ ν΄μ ν λ²μ μμΉλ₯Ό μ ν΄μ£Όλ κ²½μ°λ₯Ό μκ°ν΄λ³΄μλλ° μνμ,, 머리 μ°κΈ° μ«μ΄μ§ μΌλ¨ ν¨μ€
μΌλ¨μ 3μ€ ν¬λ¬ΈμΌλ‘ ν΄λ³΄μ! νλλ° μκ°μ΄κ³Ό γ γ γ γ
R, C, M = map(int, input().split())
board = [ [0] * C for _ in range(R) ]
for shark in range(M):
r, c, s, d, z = map(int, input().split())
board[r-1][c-1] = (s, d-1, z)
dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]
def move():
move_board = [ [0] * C for _ in range(R) ]
for i in range(R):
for j in range(C):
if board[i][j]:
r, c, s, d, z = i, j, board[i][j][0], board[i][j][1], board[i][j][2]
for moving in range(s):
if (r == 0 and d == 0): d = 1
elif (c == 0 and d == 3): d = 2
elif (r == (R-1) and d == 1): d = 0
elif (c == (C-1) and d == 2): d = 3
r += dx[d]
c += dy[d]
if move_board[r][c]:
if move_board[r][c][2] < z:
move_board[r][c] = (s,d,z)
else:
move_board[r][c] = (s,d,z)
return move_board
def solve(c):
size = 0
for x in range(R):
if board[x][c] :
size += board[x][c][2]
board[x][c] = 0
return size
return size
result = 0
for i in range(C):
result += solve(i)
board = move()
print(result)
μκ° μ΄κ³Ό μ λκ² νλ €λ©΄ μμ΄κ° μ΄λνλ μκ°μ O(1)λ‘.. μλ μ½λλ‘ μ΄λ ν¨μλ°κΏμ£Όλ©΄ ν΅κ³Ό.. μπ
def move_shark():
move_board = [[0] * C for _ in range(R)]
for i in range(R):
for j in range(C):
if board[x][y]:
r, c, s, d, z = i, j, board[i][j][0], board[i][j][1], board[i][j][2]
total = s
if d == 0 or d == 1:
s %= 2 * R - 2
while s:
if (r == R - 1 and d == 1) or (r == 0 and d == 0):
d ^= 1
r += dx[d]
s -= 1
else:
s %= 2 * C - 2
while s:
if (c == C - 1 and d == 2) or (c == 0 and d == 3):
d = (d - 2)^1 + 2
c += dy[d]
s -= 1
if move_board[r][c] and move_board[r][c][2] > z:
pass
else:
move_board[r][c] = (total, d, z)
return move_board