BOJ 2146ブリッジの作成
18128 ワード
https://www.acmicpc.net/problem/2146
時間2秒、メモリ192 MB
input : N(1 <= N <= 100) Nの数字(0は海、1は陸地) output : 出力最短ブリッジ長 条件:この国は複数の島からなり、島とは東西南北の陸地が連なるブロック を指す.
初めて近づいた時.
私たちはまずBFSで島を並べ替えます.
2, 3, 4 .....
そして、島の端の部分を列に入れます.
BFSを実行し、最初に別の島に到着した場合、切断して出力します.
queueが無限に増加したためか、メモリが超過しています.やれやれ...
他人の解答を見て、改善すべきところを探します.島の枠部分をキューに入れたとき.これ以上繰り返さないで、グループ分けの時に分類しましょう.
in methodで重複を生じないでください.
上、下、左、右の島番号を実行します.
島番号**より小さい場合**
**さんはどういう意味ですか.
Qが出した島号の存在順.
2,3,4の順序でキューに入れると、キューから削除し直すときも順序が保たれます.
すでにBFSが実行されており、2人の島は1つの距離を増やした.
ここに4人の島がBFSを実行している場合、
この場合、距離を求めるには
隣接する島の番号より大きい場合.
島番号が4の場合、実行BFSは5と出会う.この場合、BFSを実行する前に見たことがあるが、
1号/2号に分けられるような気がしたので火麟を入れて色々しました
結局これに時間がかかったので...今度アクセルを再利用しようか口だけで书くのはおかしい...
時間2秒、メモリ192 MB
input :
初めて近づいた時.
私たちはまずBFSで島を並べ替えます.
2, 3, 4 .....
そして、島の端の部分を列に入れます.
BFSを実行し、最初に別の島に到着した場合、切断して出力します.
queueが無限に増加したためか、メモリが超過しています.やれやれ...
他人の解答を見て、改善すべきところを探します.
elif graph[nx][ny] == 0 and not (now_x, now_y, 0) in queue:
queue.append((now_x, now_y, 0))
(nx,ny)が島の外、すなわち海であれば、現在存在する(now x,now y)をキューに入れ、距離を0と表す.in methodで重複を生じないでください.
距離を求める時
上、下、左、右の島番号を実行します.
島番号**より小さい場合**
**さんはどういう意味ですか.
Qが出した島号の存在順.
2,3,4の順序でキューに入れると、キューから削除し直すときも順序が保たれます.
すでにBFSが実行されており、2人の島は1つの距離を増やした.
ここに4人の島がBFSを実行している場合、
4가 들어와야 함
位に達します.この場合、距離を求めるには
(cnt + 1) * 2 - 1
を計算します.隣接する島の番号より大きい場合.
島番号が4の場合、実行BFSは5と出会う.この場合、BFSを実行する前に見たことがあるが、
(cnt) * 2
を計算する必要がある. if graph[nx][ny] == 0:
graph[nx][ny] = graph[x][y]
queue.append((nx, ny, cnt + 1))
elif graph[nx][ny] > graph[x][y]:
dis = min(dis, cnt * 2)
elif graph[nx][ny] < graph[x][y]:
dis = min(dis, ((cnt + 1) * 2) - 1)
このBFSを1ラウンドずつ1号/2号に分けられるような気がしたので火麟を入れて色々しました
結局これに時間がかかったので...今度アクセルを再利用しようか口だけで书くのはおかしい...
import sys
from _collections import deque
n = int(sys.stdin.readline())
graph = []
for i in range(n):
data = list(map(int, sys.stdin.readline().split()))
graph.append(data)
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def BFS(x, y, num):
q = deque([(x, y)])
graph[x][y] = num
while q:
now_x, now_y = q.popleft()
for i in range(4):
nx = now_x + dx[i]
ny = now_y + dy[i]
if nx >= n or nx < 0 or ny >= n or ny < 0:
continue
if graph[nx][ny] == 1:
graph[nx][ny] = num
q.append((nx, ny))
elif graph[nx][ny] == 0 and not (now_x, now_y, 0) in queue:
queue.append((now_x, now_y, 0))
cnt = 2
queue = deque()
for i in range(n):
for j in range(n):
if graph[i][j] == 1:
BFS(i, j, cnt)
cnt += 1
dis = 99999
while queue:
done = False
x, y, cnt = queue.popleft()
for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if nx >= n or nx < 0 or ny >= n or ny < 0:
continue
if graph[nx][ny] == 0:
graph[nx][ny] = graph[x][y]
queue.append((nx, ny, cnt + 1))
elif graph[nx][ny] > graph[x][y]:
dis = min(dis, cnt * 2)
elif graph[nx][ny] < graph[x][y]:
dis = min(dis, ((cnt + 1) * 2) - 1)
print(dis)
Reference
この問題について(BOJ 2146ブリッジの作成), 我々は、より多くの情報をここで見つけました https://velog.io/@jsin2475/BOJ-2146-다리-만들기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol