2630.色紙を作る
8046 ワード
質問する
白準2630号カラーペーパーを作る
に答える
分割征服アルゴリズムは久しぶりで、解法をすっかり忘れてしまいました...
統合ソートアルゴリズムを見て概念を再認識し、
ステータスツリーを描き終わってから、コードの編成方法を考えます.
再帰的検索により,白と青の合計紙数を算出した.
同じ色でなければ4つの色紙に分かれているので、ステータスツリーも4本の枝を伸ばしています.
f(size, x, y)
〜size
は領域のサイズであり、x, y
は領域の開始インデックスである.size
が1
になると、その領域の色が返される.4つの領域の戻り値は、リスト
area
に保存される.値が同じ場合は->領域の色を返します
同じ値でなければ->白と青の個数を足す
すべての検索が完了すると、メイン関数で呼び出された
f(n, 0, 0)
が終了すると、最後の値last_val
の結果に従って、1はblue
、0はwhite
に1が加算されます.import sys
def f(size, x, y):
global white, blue
if size == 1: return board[x][y]
else:
nxt_n = size // 2
area = [0, 0, 0, 0]
area[0] = f(nxt_n, x, y)
area[1] = f(nxt_n, x, y + nxt_n)
area[2] = f(nxt_n, x + nxt_n, y)
area[3] = f(nxt_n, x + nxt_n, y + nxt_n)
if all(x == 1 for x in area) or all(x == 0 for x in area): return area[0]
else:
white += area.count(0)
blue += area.count(1)
return -1
n = int(sys.stdin.readline())
board = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
white, blue = 0, 0
last_val = f(n, 0, 0)
if last_val == 1: blue += 1
elif last_val == 0: white += 1
print(f'{white}\n{blue}')
Reference
この問題について(2630.色紙を作る), 我々は、より多くの情報をここで見つけました https://velog.io/@kimsen/2630.-색종이-만들기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol