壁を壊して移動する4
質問する
https://www.acmicpc.net/problem/16946
コード#コード#
from collections import deque
input = __import__('sys').stdin.readline
def bfs(y, x):
q = deque()
q.append((y, x))
temp[y][x] = num
cnt = 1
while q:
nowy, nowx = q.popleft()
for i in range(4):
newy = d[i][0]+nowy
newx = d[i][1]+nowx
if newy < 0 or newy >= n or newx < 0 or newx >= m or board[newy][newx] != 0 or temp[newy][newx] != 0:
continue
temp[newy][newx] = num
q.append((newy, newx))
cnt += 1
return cnt
n, m = map(int, input().split())
board = [list(map(int, input().strip())) for _ in range(n)]
temp = [[0]*m for _ in range(n)]
d = [[0, 1], [0, -1], [1, 0], [-1, 0]]
cnts = {}
num = 1
for i in range(n):
for j in range(m):
if board[i][j] == 1 or temp[i][j] != 0:
continue
cnt = bfs(i, j)
cnts[num] = cnt
num += 1
for i in range(n):
for j in range(m):
if board[i][j] == 0:
continue
group_list = set()
for di in range(4):
newy = d[di][0]+i
newx = d[di][1]+j
if newy < 0 or newy >= n or newx < 0 or newx >= m or temp[newy][newx] == 0:
continue
group_list.add(temp[newy][newx])
for k in group_list:
board[i][j] += cnts[k]
board[i][j] %= 10
result = ''
for i in board:
result += ''.join(map(str, i))+'\n'
print(result)
に答える
dfs、bfsを使用したプール
最初のアクセスはdfsを使用し、現在の座標値が1の場合、dfsで接続の0値を計算することでboard[i][j]を修正し、正解は正しいがタイムアウトし、Googleを検索し、解決策を見つけた.
ゼロ連続領域パケットを格納してカウントし、時間を節約
bfsが0の範囲でグループ番号を指定します.たとえば、問題2の例です.
4 5
11001
00111
01010
10101
入力に成功するとtempは00110
22000
20304
05060
このように保存されていますが、そのエリアの番号を保存しました.次に、グループ番号をインデックスとしてリストまたはディレクトリを作成し、領域のサイズを保存します.
print(list) #[0,2,3,1,1,1,1]
1番グループの0個数は2個2番グループの0個数は3個~~そして黒板を1周して、4方向のグループ番号の値を加えればいいです.
ポスト
bfs関数の設計が間違っていたので、2時間の問題を探しましたが、今回の問題のように、エリアを探すアルゴリズムをソフトペンと呼び、エリアをグループ化して時間を短縮する方法はおそらく一人では考えられなかったのではないでしょうか.
この二時間は大変でしたが、いろいろ勉強になりました.
Reference
この問題について(壁を壊して移動する4), 我々は、より多くの情報をここで見つけました https://velog.io/@josajang98/백준-16946-벽-부수고-이동하기-4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol