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',
'.*************.',
'..***********..',
'...*********...']
规律推导
-
整体结构:
- 图形的大小是
5n x 5n。 - 图形的外框由
.和*组成,中间是字母O,其中部分内容由O和.混合形成。 - 其中四个角分别是. , 而不是* ,所以要看情况加上*
- 图形的大小是
-
外框:
- 外框的每一行和每一列都有
n个.和4n个*。 - 外框的四个角是
.,其余部分是*。
- 外框的每一行和每一列都有
-
内部结构:
- 内部区域由
O和.组成。 - 内部区域的大小是
3n x 3n,位于图形的中心。 - 内部区域的中心部分是
.,其余部分是O。
- 内部区域由
具体规律
-
外框:
-
第
i行和第i列(i从 0 到n-1):- 前
i个字符是.,后5n - i个字符是*。
- 前
-
第
5n - i - 1行和第5n - i - 1列(i从 0 到n-1):- 前
i个字符是.,后5n - i个字符是*。
- 前
-
-
内部结构:
- 内部区域从第
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