728x90
반응형
https://www.acmicpc.net/problem/20056
20056번: 마법사 상어와 파이어볼
첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치
www.acmicpc.net
문제 해결
- 조건이 한 번에 이해하기 까다로웠다.
- 이동을 할 때 n행과 1행이 연결되어있어서 n행을 넘어가면 1행으로 텔레포트(?)가 가능하고 1열과 n열이 연결되어있어 n열이 넘어가면 1열로 텔레포트가 가능하다.
- 그리고 바닥 함수가 기호로 써져있어서 알지 못하면 처음에 이해하기 어려울 수 있다.
바닥 함수와 천장 함수 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 수학과 컴퓨터 과학에서 바닥 함수(영어: floor function)는 각 실수 이하의 최대 정수를 구하는 함수이다. 천장 함수(天障函數, 영어: ceiling function)는 각 실수 이상
ko.wikipedia.org
나머지는 조건을 이해하는데 큰 어려움은 없었으며 그래프를 이용하면 쉽게 풀 수 있다.
CODE
import math
def simulate():
global board
temp = [[[] for _ in range(n)]for _ in range(n)]
dxs = [-1,-1,0,1,1,1,0,-1]
dys = [0,1,1,1,0,-1,-1,-1]
for i in range(n):
for j in range(n):
for k in range(len(board[i][j])):
mi,si,di = board[i][j][k]
ni = (i + dxs[di]*si)%n
nj = (j + dys[di]*si)%n
temp[ni][nj].append([mi,si,di])
# for i in range(n):
# print(temp[i])
board = [[[] for _ in range(n)]for _ in range(n)]
for i in range(n):
for j in range(n):
if len(temp[i][j]) >=2:
m = 0
s = 0
d = temp[i][j][-1][-1]
flag = True
for k in range(len(temp[i][j])):
m += temp[i][j][k][0]
s += temp[i][j][k][1]
if d%2 != temp[i][j][k][2]%2:
flag = False
if math.floor(m/5) ==0: continue
for c in range(4):
if flag:
board[i][j].append([math.floor(m/5),math.floor(s/len(temp[i][j])),2*c])
else:
board[i][j].append([math.floor(m/5),math.floor(s/len(temp[i][j])),2*c+1])
elif len(temp[i][j])==1:
board[i][j].append(temp[i][j][0])
if __name__=='__main__':
n, m, k = map(int, input().split())
board = [[[] for _ in range(n)]for _ in range(n)]
answer = 0
for _ in range(m):
ri,ci,mi,si,di = map(int, input().split())
board[ri-1][ci-1].append([mi,si,di])
for _ in range(k):
simulate()
for i in range(n):
for j in range(n):
for c in range(len(board[i][j])):
answer += board[i][j][c][0]
print(answer)
728x90
반응형
댓글