ARC080 D - Grid Coloring
解説(右左に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("")