如何用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()
代码说明
- 边界初始化:先创建全
.矩阵,一次性填充底部行和右侧列的X,逻辑简洁高效。 - 分层迭代:通过
top、right、bottom三个变量控制每层的绘制范围,完成一层后向内收缩边界,直到无内层可处理。 - 中心补全:当n为奇数时,单独将中心位置设为
X,保证螺旋完整性。 - 输入处理:循环读取输入值,遇到0停止,每个螺旋输出后添加空行,完全符合题目要求。
测试示例
输入5,输出:
XXXXX X...X .X..X ..XXX XXXXX
输入4,输出:
XXXX X..X .XXX XXXX
内容的提问来源于stack exchange,提问作者Alba
相关产品推荐
相关产品推荐

