題目
思路
最初我是沒有看出什么規律的,但是如果將圖案畫在本子上,就可以看出端倪了(字符顯示有一些失真)。
從最中間開始看樣例1,最中間的是一個由' $ '組成的十字架,向外圍看,又由一層' . '圍了起來,在外圍又由' $ '圍起來,以此類推。
一層包括了最中間的五個長度的' $ '十字架和外面一層' . '和一層' $ '
問題描述中的為三層,包括最中間的五個長度的' $ '十字架和外面三層' . '和三層' $ '
這樣規律便找到了!!!~
實現
我看到其他人將圖形分為了四塊,每塊中又分為上中下三部分,之后依次按照每個部分打印
我的思路是從中間開始的,所以我想到先用數組(列表)占用內存,再從中間向外邊填充(默認所有都是點,填充$),而且這樣可能時間復雜度較高一些...姑且這么做把
規模是 5+2*2*層數,5是中心十字架的長度,第一個2是對稱性,第二個2是一層' $ '一層' . '
最中心的行是 3+層數*2,列也是這樣(第一行開始算起)(代碼從第0行)
每塗一層,都要遍歷整個網格,將他們周邊的(以已經塗色的為中心,3*3的小網格)沒有塗過的,塗為另一種符號,每次塗一層
當層數為1時,塗一層' . ',塗一層' $ '
當層數為2時,塗一層' . ',塗一層' $ ',塗一層' . ',塗一層' $ '
在輸出時,將未塗色的和塗色為2的顯示輸出為' . ',將塗色為1的輸出為' $ '
Python實現源代碼
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):
# 將$的外層變為.
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
# 將.的外層變為$
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()