[leet1765] Multi-source BFS. 重複しない部分のみを参照
Multi-source BFS
BFSとDFSの区別と定義は再帰DFSに関する問題である.つまり、[link]の同じレベルのノードにアクセスしてから、次のレベルに進みます.
この問題のように、ますます「拡散」する問題では、コードは簡単なDFSアクセスではなくBFSアクセスを使用すべきであり、特にマルチソースアクセスを使用する考えが必要である.
次の図のように、数字が一つ一つ増え、一つ一つ広がっていく場合を考えてみましょう.BFSを使ってナビゲーションを行う場合、ルートごとに1つの格しか分散できず、次のレベルに入るので、ある2つの点から出発すると、真ん中で出会うことになります.自然に隣接する格子が一番です.空欄が必要な場合、A点付近の点のみがA点のナビゲーションで生成されます.次の問題を見ると理解に役立ちます.
# multi-source BFS
queue = deque([root1, root2, root3])
while queue:
blah blah
Question
0は土地、1は水
新しいマトリクスを作成
[[1, 0],
[0,0]の場合
[[1, 0],
[2,1]この土地の形
Solution
Solution 2. waterブランチを同じレベルとしてキューに入れ、BFSを起動します.各レベルごとに1つの数字の割り当てが行われ、最終的には水1と水2点の中間で出会い、差は1を超えない.
SOL 1に比べて探索が必要な場所が著しく減少し、通過時間の制限を超えない!!
PSEUDO sol 1:コードが長すぎます.下のgithubページのソリューション1を参照してください.
PSEUDO sol2
答えmapに数字が割り当てられていない部分のみナビゲート&数字の割り当て
同じレベルで同じ順序で探索とデジタル割り当てが行われるため,2つの水点の同じ場所で探索に遭遇する.(よく理解するポイント!
def sol_2(isWater):
r = len(isWater)
c = len(isWater[0])
newiswater = [[None for k in range(c)] for l in range(r)]
deq = deque()
for row in range(r):
for col in range(c):
if isWater[row][col] == 1:
deq.append([row, col])
newiswater[row][col] = 0
while deq:
row, col = deq.popleft()
for new_row, new_col in [(row+1, col), (row-1, col), (row, col-1), (row, col+1)]:
if 0 <= new_row < r and 0 <= new_col < c and newiswater[new_row][new_col] is None: # ()
newiswater[new_row][new_col] = newiswater[row][col] + 1
deq.append((new_row, new_col))
return newiswater
github
Reference
この問題について([leet1765] Multi-source BFS. 重複しない部分のみを参照), 我々は、より多くの情報をここで見つけました https://velog.io/@jonas-jun/leet1765-Multi-source-BFSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol