📖 문제 링크
https://www.acmicpc.net/problem/23288
23288번: 주사위 굴리기 2
크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 가장 왼
www.acmicpc.net
✅ 최종 코드
주사위 좌표 하나를 실수하는 바람에 1시간 증발 ^^
제발 처음 적을때 확인 또 확인하면서 하자......
from collections import deque
n, m, k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
#동 = 0 #서 = 1
# 위 북 동 서 남 아래
dice = [[0, 4, 2, 1, 6, 5, 3], [0, 3, 2, 6, 1, 5, 4],
#남 = 2 #북 = 3
[0, 2, 6, 3, 4, 1, 5], [0, 5, 1, 3, 4, 6, 2]]
dice_m = [0, 1, 2, 3, 4, 5, 6]
#오 왼 아래 위 = 동 서 남 북
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
def bfs(a, b):
B = board[a][b]
cnt = 1
#result = 0
while check:
x, y = check.popleft()
visited[x][y] = 1
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0<=nx<n and 0<=ny<m:
if board[nx][ny] == B and visited[nx][ny] != 1:
cnt += 1
check.append([nx, ny])
visited[nx][ny] = 1
return cnt
d = 0
x, y = 0, 0
result = 0
for l in range(k):
visited = [[0 for _ in range(m)] for _ in range(n)]
#diceMove()
check = deque()
nx = x+dx[d]
ny = y+dy[d]
if nx < 0 or nx >= n or ny < 0 or ny>=m:
if d == 0: d = 1
elif d == 1: d = 0
elif d == 2: d = 3
elif d == 3: d = 2
nx = x+dx[d]
ny = y+dy[d]
tmp = [0, 0, 0, 0, 0, 0, 0]
for i in range(1, len(dice_m)):
tmp[i] = dice_m[dice[d][i]]
dice_m = tmp.copy()
#점수 구하기
check.append([nx, ny])
result += (board[nx][ny] * bfs(nx ,ny))
if dice_m[6] > board[nx][ny]:
if d == 0: d = 2
elif d == 1: d = 3
elif d == 2: d = 1
elif d == 3: d = 0
elif dice_m[6] < board[nx][ny]:
if d == 0: d= 3
elif d == 1: d = 2
elif d == 2: d = 0
elif d == 3: d = 1
x = nx
y = ny
print(result)
'알고리즘 > Python' 카테고리의 다른 글
[백준/Python] 21610번: 마법사 상어와 비바라기 (0) | 2022.04.28 |
---|---|
[백준/Python] 21608번 : 상어 초등학교 (0) | 2022.04.27 |
[백준/Python] 17144번: 미세먼지 안녕! (0) | 2022.04.21 |
[백준/Python] 7562번 : 나이트의 이동 (0) | 2022.04.14 |
[백준/Python] 7576번: 토마토 (JAVA버전 추가) (0) | 2022.04.13 |