壁を壊して移動する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時間の問題を探しましたが、今回の問題のように、エリアを探すアルゴリズムをソフトペンと呼び、エリアをグループ化して時間を短縮する方法はおそらく一人では考えられなかったのではないでしょうか.
この二時間は大変でしたが、いろいろ勉強になりました.