Python蓝桥杯练习 历届试题 打印十字图

题目

问题描述
样例输入输出

思路

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

你可能感兴趣的:(Python蓝桥杯练习 历届试题 打印十字图)