白準1012号:有機白菜

1800 ワード


問題解決の考え方
  • グラフィック理論
  • 深度優先ナビゲーション(DFS)と幅優先ナビゲーション(BFS)
  • ✔コード
    import sys
    from collections import deque
    
    T = int(sys.stdin.readline())
    
    for _ in range(T):
        M, N, K = map(int, sys.stdin.readline().split())
    
        box = [0] * (M*N)
        queue = deque([])
        stack = []
    
        for i in range(K):
            x, y = map(int, sys.stdin.readline().split())
            current = (M * y) + x
            box[current] = 1
            queue.append(current)
    
        count = 0
        while queue:
            tmp = queue.popleft()
            if box[tmp] == 1:
                stack.append(tmp)
                count += 1
            while stack:
                tmp = stack.pop()
                if tmp % M > 0:
                    if box[tmp-1] == 1:
                        stack.append(tmp-1)
                        box[tmp-1] = 0
                if (tmp+1) % M > 0:
                    if box[tmp+1] == 1:
                        stack.append(tmp+1)
                        box[tmp+1] = 0
                if tmp >= M:
                    if box[tmp-M] == 1:
                        stack.append(tmp-M)
                        box[tmp-M] = 0
                if tmp < M*(N-1):
                    if box[tmp+M] == 1:
                        stack.append(tmp+M)
                        box[tmp+M] = 0
        print(count)
  • 以前に解答したトマトの問題で、もっと考えてみれば簡単に解答できました.
  • トマト問題では、完熟したトマトはどんどん周囲のトマトを熟成させるので、最初に完熟したトマトと後に完熟したトマトは同じ列で管理されています.
  • であるが,この問題は相互接続要素の個数を計算することに近いので,最初にハクサイが植え込まれた位置をキューに格納し,次いで1つずつ抽出し,スタックに戻してDFSを行う.△実際にBFSを使ってもいいです.白菜の上にミミズが動くところを見つければいいです.
  • このとき,接続されたハクサイが値を0に変更したと判断し,1つの接続要素を構成する位置がキューからスタックに2回以上入ることはない.

  • ✔関連概念
  • グラフィック理論とグラフィックブラウズ(DFS、BFS)