ARC080-D-GridColoring 解説[python]

2021/01/03に公開

問題概要

H*Wのグリッドがあり、N色で塗り分ける。
次の条件を満たす塗り分け方を1つ出力せよ。

  • 色i のマスはちょうどai存在する
  • 各色についてその色のマスは上下左右に連結
    H,W<=100

考察

  • 構築系の問題なので、考えやすいパターンで条件を満たすものを考える
    • 上下左右に連結だが、直線的に配置していると考えると楽
    • 左上から一筆書きになるように蛇型で色i はaiだけマスをとっていけば良い

実装方針

  • 0-index で見ると偶数行は左から(0から)、奇数行は右から(w-1から)みていくことになる
  • 変数として、現在塗る色のindexと開始場所を持つ
  • 1行ずつ処理して出力する

提出コード

h, w = map(int, input().split())
n = int(input())
a = list(map(int, input().split()))
now_idx = 0
paint_num = a[0]
ans = [[-1] * w for _ in range(h)]
for i in range(h):
    for j in range(w):
        if paint_num == 0:
            now_idx += 1
            paint_num = a[now_idx]
        if i % 2:
            ans[i][w - 1 - j] = now_idx
        else:
            ans[i][j] = now_idx
        paint_num -= 1
# print(ans)
for i in range(h):
    for j in range(w):
        print(ans[i][j] + 1, end=" ")
    print()

次回解く時のメモ

  • 最初に計算量に着目してO(HW)が通ることに注目する
  • 不要な変数をとって実装が混乱したので変数の選択は注意する

Discussion