
题目考点
这道题主要考:
for循环- 字符串重复:
字符串 * 次数 - 字符串居中:
center(width, fillchar) - 图形打印规律
- 上半部分和下半部分的对称结构
这类题的核心不是算法复杂,而是找规律。你要先观察每一行由什么组成,再把规律翻译成代码。
审题
题目给你两个数:
N M
其中:
M = 3 * N
要求打印一个门垫图案。
图案只允许使用这几种字符:
.
|
-
并且中间一行要打印:
WELCOME
整个图案一共有 N 行,每一行宽度都是 M 个字符。
例如输入:
9 27
意思是:
高度 N = 9 行
宽度 M = 27 个字符
思路提示
先不要急着写代码,先把图形分成三部分:
上半部分
中间一行 WELCOME
下半部分
因为 N 是奇数,所以中间一定有一行。比如 N = 9:
上半部分:4 行
中间部分:1 行
下半部分:4 行
也就是:
N // 2
上半部分有 N // 2 行。
接着观察上半部分的规律。
每一行中间的图案都是由 .|. 重复出来的:
第 1 行:.|. 重复 1 次
第 2 行:.|..|..|. 重复 3 次
第 3 行:.|..|..|..|..|. 重复 5 次
第 4 行:重复 7 次
重复次数是:
1, 3, 5, 7, ...
也就是第 i 行重复:
2 * i + 1
其中 i 从 0 开始。
最后,每一行要用 - 补齐到宽度 M,并且让图案居中。
Python 正好有一个字符串方法:
字符串.center(总宽度, 填充字符)
例如:
".|.".center(27, "-")
意思是:把 .|. 放在宽度为 27 的位置中间,两边用 - 补齐。
完整设计思路
第一步:读取输入
题目输入是两个整数,所以用:
n, m = map(int, input().split())
这里的意思是:
input() # 读取一整行字符串,比如 "9 27"
split() # 按空格切开,得到 ["9", "27"]
map(int, ...) # 把每个字符串转成整数
最后分别赋值给 n 和 m。
第二步:打印上半部分
上半部分有 n // 2 行。
每一行的核心图案是:
".|." * (2 * i + 1)
然后居中:
pattern.center(m, "-")
所以:
for i in range(n // 2):
pattern = ".|." * (2 * i + 1)
print(pattern.center(m, "-"))
第三步:打印中间行
中间行就是:
WELCOME
也要居中,宽度是 m,两边用 - 补齐:
print("WELCOME".center(m, "-"))
第四步:打印下半部分
下半部分和上半部分完全对称,只是顺序反过来。
如果上半部分重复次数是:
1, 3, 5, 7
下半部分就是:
7, 5, 3, 1
所以可以倒着循环:
for i in range(n // 2 - 1, -1, -1):
pattern = ".|." * (2 * i + 1)
print(pattern.center(m, "-"))
这里:
range(n // 2 - 1, -1, -1)
表示从 n // 2 - 1 开始,一直倒着走到 0。
代码实现
n, m = map(int, input().split())
# 打印上半部分
for i in range(n // 2):
pattern = ".|." * (2 * i + 1)
print(pattern.center(m, "-"))
# 打印中间行
print("WELCOME".center(m, "-"))
# 打印下半部分
for i in range(n // 2 - 1, -1, -1):
pattern = ".|." * (2 * i + 1)
print(pattern.center(m, "-"))
运行演示
假设输入:
9 27
此时:
n = 9
m = 27
n // 2 = 4
所以上半部分有 4 行。
上半部分
当 i = 0:
2 * i + 1 = 1
pattern = ".|." * 1
得到:
------------.|.------------
当 i = 1:
2 * i + 1 = 3
pattern = ".|." * 3
得到:
---------.|..|..|.---------
当 i = 2:
2 * i + 1 = 5
得到:
------.|..|..|..|..|.------
当 i = 3:
2 * i + 1 = 7
得到:
---.|..|..|..|..|..|..|.---
中间行
"WELCOME".center(27, "-")
得到:
----------WELCOME----------
下半部分
下半部分反过来打印:
---.|..|..|..|..|..|..|.---
------.|..|..|..|..|.------
---------.|..|..|.---------
------------.|.------------
完整输出就是:
------------.|.------------
---------.|..|..|.---------
------.|..|..|..|..|.------
---.|..|..|..|..|..|..|.---
----------WELCOME----------
---.|..|..|..|..|..|..|.---
------.|..|..|..|..|.------
---------.|..|..|.---------
------------.|.------------
方法总结
这类“图形打印题”不要一开始就写代码,应该按这个顺序思考:
第一步,先看图形能不能分区。
这道题可以分成:
上半部分
中间行
下半部分
第二步,找每一行的核心变化规律。
这道题核心图案是:
".|."
重复次数是:
1, 3, 5, 7, ...
第三步,处理左右填充。
这道题不需要自己计算左边多少个 -、右边多少个 -,可以直接用:
center(m, "-")
第四步,利用对称性。
下半部分不用重新找规律,只需要把上半部分倒着打印。
小练习
请你尝试写一个类似程序。
输入一个奇数 n,打印高度为 n 的图形,中间一行是 PYTHON,上半部分每行打印 *,数量依次为:
1, 3, 5, 7, ...
并且每一行都用 - 居中补齐。
例如输入:
5
期望输出类似:
----*----
---***---
-PYTHON--
---***---
----*----
提示:你仍然可以使用:
center(width, "-")
关键是先确定总宽度,然后分成上半部分、中间行、下半部分。



