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 |
Tags
- TTS
- 학습
- 노래합성
- 딥러닝 음성 합성
- text-to-speech
- 음성 합성
- 딥러닝 보코더
- tacotron
- 트레이닝
- 윈도우
- 한국어 음성 합성
- Vocoder
- melgan
- 딥러닝
- deep voice
- korean tts
- DCTTS
- singing voice synthesis
- 타코트론
- 보코더
- you only look once
- YOLO
- waveglow
- 한국어 tts
Archives
- Today
- Total
chldkato
백준 13459 구슬 탈출 (파이썬) 본문
https://www.acmicpc.net/problem/13459
13459번: 구슬 탈출
첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 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해서 예외처리한다
빨간 구슬이 빠지면 1을 출력하고 bfs를 끝낸다
5. 빨간구슬과 파란구슬이 같은 위치에 놓이면 두 구슬의 이동 거리를 비교하여 겹치지 않게 처리한다
6. 두 구슬의 위치가 방문한 적 없는 위치이면 c에 기록하고 큐에 입력한다
7. 10번이 넘거나 큐가 비어있으면 0을 출력한다
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(1)
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
if cnt > 10:
print(0)
return
print(0)
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()
'백준' 카테고리의 다른 글
백준 15653 구슬 탈출 4 (파이썬) (0) | 2020.03.10 |
---|---|
백준 15644 구슬 탈출 3 (파이썬) (0) | 2020.03.10 |
백준 17406 배열 돌리기 4 (파이썬) (0) | 2020.03.10 |
백준 17472 다리 만들기 2 (파이썬) (0) | 2020.03.09 |
백준 17471 게리맨더링 (파이썬) (0) | 2020.03.08 |
Comments