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

如何用Python(矩阵法)绘制指定螺旋图案?期末编程考备考求助

解题思路与代码修正

原代码问题分析

  • 递归函数spirals_rec未传入n参数,直接依赖全局变量导致逻辑混乱
  • 递归无终止条件,会触发不必要的循环
  • 内部螺旋的填充方向、边界控制错误,比如列填充的位置偏移,未正确向内收缩边界
  • 未实现"输入以0结尾的正整数序列"的要求,原代码仅读取单个n值

修正后的实现方案

采用迭代分层绘制的思路,从最外层向内逐层构建螺旋:先固定底部行和右侧列的X,再逐层处理上边、左边的螺旋路径,直到抵达中心位置。

完整代码

import sys

def draw_spiral(n):
    # 初始化n×n矩阵,默认填充'.'
    grid = [['.' for _ in range(n)] for _ in range(n)]
    
    # 绘制底部行(全X)和右侧列(全X)
    for col in range(n):
        grid[n-1][col] = 'X'
    for row in range(n):
        grid[row][n-1] = 'X'
    
    # 分层向内绘制螺旋,初始化边界变量
    top = 0
    right = n-1
    bottom = n-1
    
    # 当还有内层可绘制时循环
    while top < bottom - 1:
        # 绘制当前层的上边:从左到右,到right-1位置(右侧列已为X)
        for col in range(top, right):
            grid[top][col] = 'X'
        # 绘制当前层的左边:从上到下,到bottom-1位置(底部行已为X)
        for row in range(top + 1, bottom):
            grid[row][top] = 'X'
        # 向内收缩边界,进入下一层
        top += 1
        bottom -= 1
        right -= 1
    
    # 处理奇数n的中心位置
    if n % 2 == 1 and top == bottom:
        grid[top][top] = 'X'
    
    # 将矩阵每行转为字符串返回
    return [''.join(row) for row in grid]

def main():
    # 读取输入序列,遇到0终止
    for line in sys.stdin:
        n = int(line.strip())
        if n == 0:
            break
        # 输出螺旋图案
        spiral = draw_spiral(n)
        for row in spiral:
            print(row)
        # 每个螺旋后空一行
        print()

if __name__ == "__main__":
    main()

代码说明

  1. 边界初始化:先创建全.矩阵,一次性填充底部行和右侧列的X,逻辑简洁高效。
  2. 分层迭代:通过top、right、bottom三个变量控制每层的绘制范围,完成一层后向内收缩边界,直到无内层可处理。
  3. 中心补全:当n为奇数时,单独将中心位置设为X,保证螺旋完整性。
  4. 输入处理:循环读取输入值,遇到0停止,每个螺旋输出后添加空行,完全符合题目要求。

测试示例

输入5,输出:

XXXXX
X...X
.X..X
..XXX
XXXXX

输入4,输出:

XXXX
X..X
.XXX
XXXX

内容的提问来源于stack exchange,提问作者Alba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:42:50