2667-番号のみ
📚 2667-番号のみ
番号のみ
に答えるグラフの問題. ツリー検索アルゴリズムです. でも、
ポストトラッキング-ツリーウィキ根拠
🔔 DFSとBFSはいつ使いますか.
(1)DFSが必要な場合全ての場合に数量を考慮する場合に使用する ・ そのため、状況の調査は一般 (2)BFSを使用する必要がある場合木の深さが無限大のとき. 迷路探索中にループが発生した場合 木の深さが無限大だったり、迷路探しで回路ができた場合 最短距離解法問題使用
この問題は?すべての場合の数を考慮して、総数を出力する必要があります.使い勝手
ソース
dfs
採点結果
bfs
採点結果
番号のみ
に答える
dfs/bfs
どっちが早いですか?ポストトラッキング-ツリーウィキ根拠
🔔 DFSとBFSはいつ使いますか.
(1)DFSが必要な場合
DFS
BFS
路はもちろん実現できるがBFS
路実現のキューの大きさが増える.スピードも同じだ.DFS
比較的便利です.大多数の質問はDFS
でも先に答えが出ます.DFS
それを逃れることはできない.(DFS
使用時にスタックオーバーフローが発生する可能性がある)BFS
便利です.BFS
この問題は?すべての場合の数を考慮して、総数を出力する必要があります.使い勝手
dfs
ソース
dfs
import sys
sys.setrecursionlimit(111111)
x_coordinate = [-1 , 0 , 1, 0]
y_coordinate = [0, 1, 0, -1]
def dfs(x, y):
global result
result += 1
visited[x][y] = True
for i in range(4):
next_x = x_coordinate[i] + x
next_y = y_coordinate[i] + y
if 1<= next_x <= n and 1 <= next_y <=n:
if visited[next_x][next_y] or graph[next_x][next_y] == 0:
continue
dfs(next_x, next_y)
n = int(sys.stdin.readline())
graph = [0]
visited = [[False] * (n+1) for _ in range(n+1)]
total_list = []
for idx in range(n):
in_graph = list(sys.stdin.readline().strip())
graph.append([0] + list(map(int, in_graph)))
for i in range(1,n+1):
for j in range(1, n+1):
if not visited[i][j] and graph[i][j] == 1:
result = 0
dfs(i, j)
total_list.append(result)
total_list.sort()
print(len(total_list))
print('\n'.join(map(str, total_list)))
採点結果
bfs
import sys
from collections import deque
x_coordinate = [-1 , 0 , 1, 0]
y_coordinate = [0, 1, 0, -1]
def bfs(x, y):
queue = deque()
# print("현재 좌표 : ", x, y)
queue.append((x, y))
visited[x][y] = True
result = 1
while queue:
x_out, y_out = queue.popleft()
for i in range(4):
next_x = x_out + x_coordinate[i]
next_y = y_out + y_coordinate[i]
if next_x < 1 or next_x > n or next_y < 1 or next_y > n:
continue
if visited[next_x][next_y]:
continue
if graph[next_x][next_y] == 0:
continue
visited[next_x][next_y] = True
result += 1
queue.append((next_x, next_y))
return result
n = int(sys.stdin.readline())
graph = [0]
visited = [[False] * (n+1) for _ in range(n+1)]
total_list = []
for idx in range(n):
in_graph = list(sys.stdin.readline().strip())
graph.append([0] + list(map(int, in_graph)))
# print(graph)
for i in range(1,n+1):
for j in range(1, n+1):
if not visited[i][j] and graph[i][j] == 1:
result = bfs(i, j)
total_list.append(result)
total_list.sort()
print(len(total_list))
print('\n'.join(map(str, total_list)))
採点結果
Reference
この問題について(2667-番号のみ), 我々は、より多くの情報をここで見つけました https://velog.io/@chang626/2667-단지번호붙이기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol