题目
思路
最初我是没有看出什么规律的,但是如果将图案画在本子上,就可以看出端倪了(字符显示有一些失真)。
从最中间开始看样例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()