BOJ 14716バナー
9031 ワード
https://www.acmicpc.net/problem/14716
2秒、512 MBメモリ
input : M Nは、スペースで区切られている(1<=M,N<=250) . 0入力0の情報 output :文字の出力 条件:
第1部文字、文字でない場合024579182 1の位置で、上、下、左、右、対角線が隣接する、互いに接続すると、一字 となる.
上下左右のベクトル.
y = [-1, 1, 0, 0]
x = [0, 0, -1, 1]
対角線のベクトル(上、上、下、下)
y = [-1, -1, 1, 1]
x = [-1, 1, -1, 1]
一番上から2 Dリストを回転し、ポイントを見つけてBFSに入れます.
これを0に変更します.
そして上のベクトルの場合をすべて入れ、1に遭遇するとキューに追加します.
BFS終了後に文字数を1文字上げる方式.
-->BFSでのアクセスはエラーです.タイムアウトメモリの過剰運転時に三位一体の攻撃を受ける.
DFSで解いてみます.
条件文も変更する必要がある場合.
華麗な攻撃を受けた採点結果.
なぜDFSが解放されたのか、BFSはだめなのかを探ってみましょう.
2秒、512 MBメモリ
input :
第1部
上下左右のベクトル.
y = [-1, 1, 0, 0]
x = [0, 0, -1, 1]
対角線のベクトル(上、上、下、下)
y = [-1, -1, 1, 1]
x = [-1, 1, -1, 1]
一番上から2 Dリストを回転し、ポイントを見つけてBFSに入れます.
これを0に変更します.
そして上のベクトルの場合をすべて入れ、1に遭遇するとキューに追加します.
BFS終了後に文字数を1文字上げる方式.
-->BFSでのアクセスはエラーです.タイムアウトメモリの過剰運転時に三位一体の攻撃を受ける.
DFSで解いてみます.
条件文も変更する必要がある場合.
if 0 <= x <= M and 0 <= y <= N and graph[nx][ny]:
dfs(nx, ny)
時間的にメリットがあるようだと判断した. if nx < 0 or nx >= N or ny < 0 or ny >= M:
continue
再帰の上限を設定してこそ、運転時エラーに陥ることはありません.import sys
sys.setrecursionlimit(100000)
正しいコード:import sys
sys.setrecursionlimit(100000)
N, M = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]
ans = 0
def dfs(x, y):
graph[x][y] = 0
dy = [-1, 1, 0, 0, -1, -1, 1, 1]
dx = [0, 0, -1, 1, -1, 1, -1, 1]
for i in range(len(dy)):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= N or ny < 0 or ny >= M:
continue
if graph[nx][ny]:
dfs(nx, ny)
for i in range(N):
for j in range(M):
if graph[i][j]:
dfs(i, j)
ans += 1
print(ans)
華麗な攻撃を受けた採点結果.
なぜDFSが解放されたのか、BFSはだめなのかを探ってみましょう.
Reference
この問題について(BOJ 14716バナー), 我々は、より多くの情報をここで見つけました https://velog.io/@jsin2475/BOJ-14716-현수막テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol