Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 트레이닝
- singing voice synthesis
- DCTTS
- TTS
- korean tts
- 음성 합성
- 한국어 tts
- 딥러닝
- 딥러닝 음성 합성
- 노래합성
- 한국어 음성 합성
- YOLO
- 학습
- waveglow
- 보코더
- 타코트론
- text-to-speech
- tacotron
- you only look once
- melgan
- 딥러닝 보코더
- 윈도우
- deep voice
- Vocoder
Archives
- Today
- Total
chldkato
백준 15653 구슬 탈출 4 (파이썬) 본문
https://www.acmicpc.net/problem/15653
15653번: 구슬 탈출 4
첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B' 로 이루어져 있다. '.'은 빈 칸을 의미하고, '#'은 공이 이동할 수 없는 장애물 또는 벽을 의미하며, 'O'는 구멍의 위치를 의미한다. 'R'은 빨간 구슬의 위치, 'B'는 파란 구슬의 위치이다. 입력되는 모든 보드
www.acmicpc.net
1. 빨간 구슬과 파란 구슬의 위치를 (rx, ry), (bx, by)에 저장한다
2. 큐에 두 구슬의 좌표를 [rx, ry, bx, by] 형태로 입력하고 방문을 체크한다
3. bfs로 이동할 때 현재 방향에서 두 구슬을 갈 수 있는 만큼 이동시킨다
중간에 구멍에 빠지거나 벽을 만나면 break 한다
4. 파란 구슬이 구멍에 빠지면 continue해서 예외처리한다
빨간 구슬이 빠지면 기울인 횟수 cnt를 출력하고 bfs를 끝낸다
5. 빨간구슬과 파란구슬이 같은 위치에 놓이면 두 구슬의 이동 거리를 비교하여 겹치지 않게 처리한다
6. 두 구슬의 위치가 방문한 적 없는 위치이면 c에 기록하고 큐에 입력한다
7. 큐가 비어있을 때까지 구멍에 빠지지 않으면 -1을 출력하고 끝낸다
from collections import deque
import sys
input = sys.stdin.readline
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def bfs():
cnt = 1
while q:
qlen = len(q)
for _ in range(qlen):
rx, ry, bx, by = q.popleft()
for i in range(4):
nrx, nry, nbx, nby = rx, ry, bx, by
while True:
nrx += dx[i]
nry += dy[i]
if a[nrx][nry] == 'O':
break
if a[nrx][nry] == '#':
nrx -= dx[i]
nry -= dy[i]
break
while True:
nbx += dx[i]
nby += dy[i]
if a[nbx][nby] == 'O':
break
if a[nbx][nby] == '#':
nbx -= dx[i]
nby -= dy[i]
break
if a[nbx][nby] == 'O':
continue
if a[nrx][nry] == 'O':
print(cnt)
return
if nrx == nbx and nry == nby:
if abs(nrx - rx) + abs(nry - ry) > abs(nbx - bx) + abs(nby - by):
nrx -= dx[i]
nry -= dy[i]
else:
nbx -= dx[i]
nby -= dy[i]
if not c[nrx][nry][nbx][nby]:
c[nrx][nry][nbx][nby] = 1
q.append([nrx, nry, nbx, nby])
cnt += 1
print(-1)
return
n, m = map(int, input().split())
a = []
for i in range(n):
row = list(input().strip())
a.append(row)
for j in range(m):
if a[i][j] == 'B':
bx, by = i, j
a[i][j] = '.'
elif a[i][j] == 'R':
rx, ry = i, j
a[i][j] = '.'
q = deque()
c = [[[[0 for _ in range(m)] for _ in range(n)] for _ in range(m)] for _ in range(n)]
q.append([rx, ry, bx, by])
c[rx][ry][bx][by] = 1
bfs()
'백준' 카테고리의 다른 글
백준 2186 문자판 (파이썬) (0) | 2020.04.10 |
---|---|
백준 3108 로고 (파이썬) (4) | 2020.04.09 |
백준 15644 구슬 탈출 3 (파이썬) (0) | 2020.03.10 |
백준 13459 구슬 탈출 (파이썬) (0) | 2020.03.10 |
백준 17406 배열 돌리기 4 (파이썬) (0) | 2020.03.10 |
Comments