알고리즘/Python
[백준/Python] 23288번 : 주사위 굴리기 2
_SIHA_
2022. 4. 29. 01:07
📖 문제 링크
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)