150. 小B的O绘制请求(构造题) | 豆包MarsCode AI刷题

57 阅读3分钟

150.小B的O绘制请求

题目用python通过,如有需要请用ai转义成其他代码,由于这道题代码没有太复杂,看看自己写也成。


题目描述:小U想要帮助小B绘制一个大小为n的字母"O"。图形的外框由".""*"组成,中间是字母"O",其中部分内容由"O""."混合形成。图形的大小由输入的正整数n决定,最终的输出是一个 5n×5n 的图形,要求每行长度为5n,图案由".", "*", "O"三种字符组合而成。


很直观的构造题,只要找出来规律,直接all in 代码就可以通过。 仔细分析即可。 先大体分析一下,首先四个角是 . 每个角都是一个三角形的. 填充。 接着是用* 填充。这里的* 也是形成一个 O 的形状, 填完O 接着是用0 进行填充O的形状, 最后在0 的填充里边用 . 进行填充。 总体是一圈套一圈。在按照样例进行仔细分析一下, 先看下样例。

样例分析

样例1:n = 1

['.***.',

 '000',

 '0.0',

 '000',

 '.***.']

样例2:n = 2

['..******..',

 '.********.',

 '000000',

 '000000',

 '00..00',

 '00..00',

 '000000',

 '000000',

 '.********.',

 '..******..']

样例3:n = 3

['...*********...',

 '..***********..',

 '.*************.',

 '000000000',

 '000000000',

 '000000000',

 '000...000',

 '000...000',

 '000...000',

 '000000000',

 '000000000',

 '000000000',

 '.*************.',

 '..***********..',

 '...*********...']

规律推导

  1. 整体结构

    • 图形的大小是 5n x 5n
    • 图形的外框由 . 和 * 组成,中间是字母 O,其中部分内容由 O 和 . 混合形成。
    • 其中四个角分别是. , 而不是* ,所以要看情况加上*
  2. 外框

    • 外框的每一行和每一列都有 n 个 . 和 4n 个 *
    • 外框的四个角是 .,其余部分是 *
  3. 内部结构

    • 内部区域由 O 和 . 组成。
    • 内部区域的大小是 3n x 3n,位于图形的中心。
    • 内部区域的中心部分是 .,其余部分是 O

具体规律

  1. 外框

    • 第 i 行和第 i 列(i 从 0 到 n-1):

      • 前 i 个字符是 .,后 5n - i 个字符是 *
    • 第 5n - i - 1 行和第 5n - i - 1 列(i 从 0 到 n-1):

      • 前 i 个字符是 .,后 5n - i 个字符是 *
  2. 内部结构

    • 内部区域从第 n 行到第 4n-1 行,从第 n 列到第 4n-1 列。
    • 内部区域的中心部分(从第 2n 行到第 3n-1 行,从第 2n 列到第 3n-1 列)是 .
    • 其余部分是 O

总结

  • 外框由 . 和 * 组成,四个角是 .,其余部分是 *
  • 内部区域由 O 和 . 组成,中心部分是 .,其余部分是 O

那么针对每部分,可以写出来具体的代码,具体部分可以看代码分析。

代码如下:

def solution(n):
    size = 5 * n
    grid = [['.' for _ in range(size)] for _ in range(size)]

    # 填充外框
    for i in range(n):
        for j in range(n - i, size - n + i):
            grid[i][j] = '*'  # 上边
            grid[size - 1 - i][j] = '*'  # 下边
            grid[j][i] = '*'  # 左边
            grid[j][size - 1 - i] = '*'  # 右边

    # 填充 'O' 区域
    for i in range(n, size - n):
        for j in range(n, size - n):
            grid[i][j] = 'O'  # 全部填充为 'O'

    # 中间的 `.` 区域
    for i in range(2 * n, 3 * n):
        for j in range(2 * n, 3 * n):
            grid[i][j] = '.'  # 中间的 '.' 区域

    # 将二维数组转换为字符串数组
    result = [''.join(row) for row in grid]
    print(result)
    return result