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 | 31 |
Tags
- 딥러닝
- 음성 합성
- DCTTS
- 한국어 tts
- 윈도우
- korean tts
- TTS
- 트레이닝
- tacotron
- 학습
- melgan
- deep voice
- 딥러닝 음성 합성
- 딥러닝 보코더
- 노래합성
- YOLO
- singing voice synthesis
- 보코더
- text-to-speech
- 타코트론
- 한국어 음성 합성
- Vocoder
- waveglow
- you only look once
Archives
- Today
- Total
chldkato
백준 20058 마법사 상어와 파이어스톰 (파이썬) 본문
https://www.acmicpc.net/problem/20058
1. 문제의 조건대로 얼음을 한조각씩 나누고 회전한다.
L이 0보다 크면 t에 나눈 얼음을 저장하고 list(zip(*t[::-1])) 로 90도 시계방향 회전한다.
t에 저장한 얼음을 a로 옮겨 갱신한다
2. 얼음이 녹는것을 처리하려면 모든 얼음이 동시에 녹아야 하므로 b에 a를 복사한다.
L이 0이면 회전을 안하므로 b에 a를 복사만 한다.
3. 인접한 칸이 범위를 벗어나지 않고 얼음이 있으면 cnt를 센다.
cnt가 3보다 적고 b의 현재 칸에 얼음이 있으면 a에서 1을 빼 얼음을 녹인다.
4. 남은 얼음의 총합을 출력한다.
5. bfs로 탐색하면서 덩어리가 차지하는 칸의 개수를 세고, 그 중 max 값을 출력한다
from copy import deepcopy
from collections import deque
import sys
input = sys.stdin.readline
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
n, q = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(2 ** n)]
ll = map(int, input().split())
for l in ll:
if l > 0:
for i in range(0, 2 ** n, 2 ** l):
for j in range(0, 2 ** n, 2 ** l):
t = [a[k][j:j + 2 ** l] for k in range(i, i + 2 ** l)]
t = list(zip(*t[::-1]))
for x in range(2 ** l):
for y in range(2 ** l):
a[x + i][y + j] = t[x][y]
b = deepcopy(a)
if l == 0:
b = deepcopy(a)
for x in range(2 ** n):
for y in range(2 ** n):
cnt = 0
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if not 0 <= nx < 2 ** n or not 0 <= ny < 2 ** n:
continue
if b[nx][ny] > 0:
cnt += 1
if cnt < 3 and b[x][y] > 0:
a[x][y] -= 1
ans1 = sum(sum(s) for s in a)
print(ans1)
c = [[0]*(2**n) for _ in range(2 ** n)]
q = deque()
ans2 = 0
for i in range(2 ** n):
for j in range(2 ** n):
if a[i][j] != 0 and c[i][j] == 0:
q.append([i, j])
c[i][j] = 1
cnt = 1
while q:
x, y = q.pop()
for d in range(4):
nx = x + dx[d]
ny = y + dy[d]
if 0 <= nx < 2 ** n and 0 <= ny < 2 ** n:
if a[nx][ny] != 0 and c[nx][ny] == 0:
cnt += 1
c[nx][ny] = 1
q.append([nx, ny])
ans2 = max(ans2, cnt)
print(ans2)
'백준' 카테고리의 다른 글
백준 21609 상어 중학교 (파이썬) (0) | 2021.05.16 |
---|---|
백준 21608 상어 초등학교 (파이썬) (0) | 2021.05.15 |
백준 20057 마법사 상어와 토네이도 (파이썬) (0) | 2021.02.20 |
백준 20056 마법사 상어와 파이어볼 (파이썬) (0) | 2020.10.29 |
백준 20055 컨베이어 벨트 위의 로봇 (파이썬) (0) | 2020.10.28 |
Comments