如何正确编写代码生成符合规则的n×m刺绣图案?
刺绣图案生成问题求解
需求说明
生成一个n×m的矩形刺绣图案,规则如下:
- 图案由从矩形左上角和右上角出发的45°射线构成
- 射线碰到垂直边时反射,碰到底边时消失
- 输入:两个整数n(高度)和m(宽度),范围3≤n,m≤1000
- 输出:对应尺寸的图案
示例输入输出
示例1
输入:
6 4
输出:
x..x
.xx.
.xx.
x..x
.xx.
.xx.
示例2
输入:
12 5
输出:
x...x
.x.x.
..x..
.x.x.
x...x
.x.x.
..x..
.x.x.
x...x
.x.x.
..x..
.x.x.
错误代码
def create_ornament(n, m): for i in range(n): for j in range(m): if (i + j) % 4 == 0 or (i - j) % 4 == 0: print("x", end="") else: print(".", end="") print() n, m = map(int, input().split()) create_ornament(n, m)
问题分析
原代码错误地使用固定模4的条件判断,没有考虑射线反射后的路径规律。实际上,射线在水平方向来回反射的周期由宽度m决定:周期为2*(m-1),这是射线从一侧垂直边到另一侧再返回的总步数。
正确代码
def create_ornament(n, m): period = 2 * (m - 1) for i in range(n): row = [] for j in range(m): if (i + j) % period == 0 or (i - j) % period == 0: row.append('x') else: row.append('.') print(''.join(row)) n, m = map(int, input().split()) create_ornament(n, m)
代码解释
- 计算周期
period = 2*(m-1):确定射线在水平方向往返一次的步数,是图案重复的核心规律 - 遍历每一行i和每一列j:
(i+j) % period == 0:对应从左上角(0,0)出发的射线路径(i-j) % period == 0:对应从右上角(0, m-1)出发的射线路径- 满足任一条件则标记为
x,否则为.
- 使用列表拼接后打印,相比逐个字符输出更高效,适配n、m最大为1000的场景
内容的提问来源于stack exchange,提问作者Serhiy
相关产品推荐
相关产品推荐

