題目
思路
最初我是沒有看出什么規(guī)律的谍肤,但是如果將圖案畫在本子上,就可以看出端倪了(字符顯示有一些失真)哗伯。
從最中間開始看樣例1荒揣,最中間的是一個由' $ '組成的十字架,向外圍看焊刹,又由一層' . '圍了起來系任,在外圍又由' $ '圍起來,以此類推虐块。
一層包括了最中間的五個長度的' $ '十字架和外面一層' . '和一層' $ '
問題描述中的為三層俩滥,包括最中間的五個長度的' $ '十字架和外面三層' . '和三層' $ '
這樣規(guī)律便找到了!:氐臁霜旧!~
實現(xiàn)
我看到其他人將圖形分為了四塊,每塊中又分為上中下三部分儡率,之后依次按照每個部分打印
我的思路是從中間開始的,所以我想到先用數(shù)組(列表)占用內(nèi)存,再從中間向外邊填充(默認所有都是點洗显,填充$),而且這樣可能時間復雜度較高一些...姑且這么做把
規(guī)模是 5+2*2*層數(shù)玖媚,5是中心十字架的長度,第一個2是對稱性婚脱,第二個2是一層' $ '一層' . '
最中心的行是 3+層數(shù)*2今魔,列也是這樣(第一行開始算起)(代碼從第0行)
每涂一層,都要遍歷整個網(wǎng)格障贸,將他們周邊的(以已經(jīng)涂色的為中心错森,3*3的小網(wǎng)格)沒有涂過的,涂為另一種符號篮洁,每次涂一層
當層數(shù)為1時涩维,涂一層' . ',涂一層' $ '
當層數(shù)為2時袁波,涂一層' . '瓦阐,涂一層' $ ',涂一層' . '篷牌,涂一層' $ '
在輸出時睡蟋,將未涂色的和涂色為2的顯示輸出為' . ',將涂色為1的輸出為' $ '
Python實現(xiàn)源代碼
n=int(input())
lst=[[0 for j in range(5+4*n)] for i in range(5+4*n)]
# 0代表未涂色
# 1代表$
# 2代表.
for i in range(-2,3):
lst[2+2*n][2+2*n+i]=1 # 中心行
for i in range(-2,3):
lst[2+2*n+i][2+2*n]=1 # 中心列
def paint(color):
# 將$的外層變?yōu)?
if(color==1):
for i in range(5+4*n):
for j in range(5+4*n):
if(lst[i][j]==1):
for u in range(-1,2):
for v in range(-1,2):
if(i+u>=0 and i+u<5+4*n and j+v>=0 and j+v<5+4*n):
if(lst[i+u][j+v]==0):
lst[i+u][j+v]=2
# 將.的外層變?yōu)?
else:
for i in range(5+4*n):
for j in range(5+4*n):
if(lst[i][j]==2):
for u in range(-1,2):
for v in range(-1,2):
if(i+u>=0 and i+u<5+4*n and j+v>=0 and j+v<5+4*n):
if(lst[i+u][j+v]==0):
lst[i+u][j+v]=1
for i in range(n):
paint(1)
paint(2)
for i in range(5+4*n):
for j in range(5+4*n):
if(lst[i][j]==1):
print("$",end="")
else:
# 最后會有角落未涂色枷颊,但都是輸出.
print(".",end="")
print()