▼考え方
ポイントになる考え方1.~3.を以下に示します。
1.マップのナンバリングは関数numberingで行います。引数はDです。
2.ナンバリングの向きDに応じて、各種変数を定めます。
3.ナンバリングがされている(if)ならば次のループへ、ナンバリングされていない(else)ならばナンバリングします。
▼コード
# 考え方1.
def numbering(D):
# a:次にナンバリングするマスの座標に移動するために、増加させる変数
# number:マップにナンバリングする数
a = 0
number = 1
# 考え方2.
if D==1:
# s1,s2:WあるいはH
# th:添え字(k1,k2)がマップの範囲内に存在する条件
# y:ナンバリングするマスのy座標
# x:ナンバリングするマスのx座標
s1 = W
s2 = H
th = "k2-a>=0 and k1+a<W"
y = "k2-a"
x = "k1+a"
if D==2:
s1 = W
s2 = H
th = "k1+a<W"
y = "k2"
x = "k1+a"
if D==3:
s1 = W
s2 = H
th = "k2+a<H"
y = "k2+a"
x = "k1"
if D==4:
s1 = H
s2 = W
th = "k1+a<H and k2-a>=0"
y = "k1+a"
x = "k2-a"
for k1 in range(s1):
for k2 in range(s2):
while eval(th):
# 考え方3.
if N[eval(y)][eval(x)]!=0:
break
else:
N[eval(y)][eval(x)] = number
number += 1
a += 1
a = 0
for j in range(H):
print(*N[j],sep=' ')
########## 処理0(準備) インプット,リスト定義 ###########
H,W,D = map(int,input().split())
# N:ナンバリング用リスト
N = [[0 for i in range(W)] for j in range(H)]
########## 処理1 マップのナンバリング、マップの出力 ###########
numbering(D)