You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确编写代码生成符合规则的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:33:26