center(width, fillchar)

题目考点

这道题主要考:

  1. for 循环
  2. 字符串重复:字符串 * 次数
  3. 字符串居中:center(width, fillchar)
  4. 图形打印规律
  5. 上半部分和下半部分的对称结构

这类题的核心不是算法复杂,而是找规律。你要先观察每一行由什么组成,再把规律翻译成代码。


审题

题目给你两个数:

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

其中 i0 开始。

最后,每一行要用 - 补齐到宽度 M,并且让图案居中。

Python 正好有一个字符串方法:

字符串.center(总宽度, 填充字符)

例如:

".|.".center(27, "-")

意思是:把 .|. 放在宽度为 27 的位置中间,两边用 - 补齐。


完整设计思路

第一步:读取输入

题目输入是两个整数,所以用:

n, m = map(int, input().split())

这里的意思是:

input()        # 读取一整行字符串,比如 "9 27"
split()        # 按空格切开,得到 ["9", "27"]
map(int, ...)  # 把每个字符串转成整数

最后分别赋值给 nm


第二步:打印上半部分

上半部分有 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, "-")

关键是先确定总宽度,然后分成上半部分、中间行、下半部分。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇