알고리즘/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)