白駿3482号:Labyrinth
Labyrinth
白駿3482号:Labyrinth
アイデア
迷宮ではロープを一番長くつなぐように工夫しなければならない.つまり,「最も遠い2つのノード」の長さを求めればよい.どうすればいいですか.
問題は、「迷路の設計は、任意の2つのfreeブロックの間に1つのパスしかありません.適切なフックを見つけて接続すると、正しいパスを見つけて接続しやすくなります」ということです.上に書いてあります.
迷路は全体的につながっており,2つのノードの唯一の経路が存在する.クリスマスツリーの問題です昨日解いたツリーの直径問を適用して解くことができます.0と1で表される迷宮bfsを用いて解いた.
コード#コード#
import sys
import copy
from collections import deque
input = sys.stdin.readline
dy = [0, 0, 1, -1]
dx = [1, -1, 0, 0]
def bfs(start, graph, C, R):
m = (1, -1, -1)
q = deque()
q.append(start)
graph[start[0]][start[1]] = 1
while q:
y, x = q.popleft()
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if ny >= R or nx >= C or ny < 0 or nx < 0:
continue
elif graph[ny][nx] > 0:
continue
else:
graph[ny][nx] = graph[y][x] + 1
if graph[ny][nx] > m[0]:
m = (graph[ny][nx], ny, nx)
q.append((ny, nx))
return m
T = int(input())
while T > 0:
labyrinth = []
start = None
C, R = map(int, input().split())
for i in range(R):
lst = []
t = input().rstrip()
for j in range(C):
if t[j] == '#':
lst.append(1)
elif t[j] == '.':
lst.append(0)
if not start:
start = (i, j)
labyrinth.append(lst)
res1 = bfs(start, copy.deepcopy(labyrinth), C, R)
res2 = bfs((res1[1], res1[2]), copy.deepcopy(labyrinth), C, R)
print(f"Maximum rope length is {res2[0] - 1}.")
T -= 1
おしゃべり
初めて英語の問題をしました.実は私は翻訳機を回しました.
ゴールド3達成
Reference
この問題について(白駿3482号:Labyrinth), 我々は、より多くの情報をここで見つけました
https://velog.io/@ks1ksi/백준-3482번-Labyrinth
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import sys
import copy
from collections import deque
input = sys.stdin.readline
dy = [0, 0, 1, -1]
dx = [1, -1, 0, 0]
def bfs(start, graph, C, R):
m = (1, -1, -1)
q = deque()
q.append(start)
graph[start[0]][start[1]] = 1
while q:
y, x = q.popleft()
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if ny >= R or nx >= C or ny < 0 or nx < 0:
continue
elif graph[ny][nx] > 0:
continue
else:
graph[ny][nx] = graph[y][x] + 1
if graph[ny][nx] > m[0]:
m = (graph[ny][nx], ny, nx)
q.append((ny, nx))
return m
T = int(input())
while T > 0:
labyrinth = []
start = None
C, R = map(int, input().split())
for i in range(R):
lst = []
t = input().rstrip()
for j in range(C):
if t[j] == '#':
lst.append(1)
elif t[j] == '.':
lst.append(0)
if not start:
start = (i, j)
labyrinth.append(lst)
res1 = bfs(start, copy.deepcopy(labyrinth), C, R)
res2 = bfs((res1[1], res1[2]), copy.deepcopy(labyrinth), C, R)
print(f"Maximum rope length is {res2[0] - 1}.")
T -= 1
Reference
この問題について(白駿3482号:Labyrinth), 我々は、より多くの情報をここで見つけました https://velog.io/@ks1ksi/백준-3482번-Labyrinthテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol