いむらや競プロ雑記

キーワード:競プロ、育児、石川県

ARC080 D - Grid Coloring

atcoder.jp

解説(右左に1段ずつ下がりながら塗っていく)を見た今となっては何故・・・という解法だけど、「外周を(まだ塗ってないマスを探し)ぐるぐる回りながら塗っていく」という、最初に閃いたネタに固執してしまい、やたら苦労した。 ちょっと面白いコードになった気がするので、掲載。

  • 現在地と盤面のサイズから、外周をなぞるために次に行くべき方向を計算(check関数)
  • 1マスごとに塗るべき色リストを作成(colors)
  • あとは画素数(画像処理のイメージでやっている…)でループを回し、初期位置(0,0)から、1処理ごとに現在地を塗って、進むべき方向に進んで、を繰り返す。
  • ⇒ 外周を回り込むタイプの出力ができる
1 2 2 3 3
5 5 5 5 3
5 4 4 4 4
#  1
#4 # 2
#  3
def check(HW,h,w,H,W):
  if w<W and HW[h][w+1]==0:
    return 2
  if h<H and HW[h+1][w]==0:
    return 3
  if w>0 and HW[h][w-1]==0:
    return 4
  if h>0 and HW[h-1][w]==0:
    return 1
    

def resolve():
  H,W=map(int,input().split())
  N=int(input())
  A=list(map(int,input().split()))

  colors=[]
  for i in range(N):
    for j in range(A[i]):
      colors.append(i+1)

  ans = [[0 for j in range(W)] for i in range(H)]
  curH=0
  curW=0

  for i in range(H*W):
    checkres=check(ans,curH,curW,H-1,W-1)
    ans[curH][curW]=colors[i]
    if(checkres==2):
      curW+=1
    elif(checkres==3):
      curH+=1
    elif(checkres==4):
      curW-=1
    elif(checkres==1):
      curH-=1
      
  for i in range(H):
    for j in range(W):
      print(ans[i][j],end=" ")
    print("")