问题描述
小U想要帮助小B绘制一个大小为nn的字母"O"。图形的外框由"."和"*"组成,中间是字母"O",其中部分内容由"O"和"."混合形成。图形的大小由输入的正整数nn决定,最终的输出是一个 5n×5n5n×5n 的图形,要求每行长度为5n5n,图案由".", "*", "O"三种字符组合而成。
测试样例
样例1:
输入:
n = 1
输出:['.***.', '*OOO*', '*O.O*', '*OOO*', '.***.']
样例2:
输入:
n = 2
输出:['..******..', '.********.', '**OOOOOO**', '**OOOOOO**', '**OO..OO**', '**OO..OO**', '**OOOOOO**', '**OOOOOO**', '.********.', '..******..']
样例3:
输入:
n = 3
输出:['...*********...', '..***********..', '.*************.', '***OOOOOOOOO***', '***OOOOOOOOO***', '***OOOOOOOOO***', '***OOO...OOO***', '***OOO...OOO***', '***OOO...OOO***', '***OOOOOOOOO***', '***OOOOOOOOO***', '***OOOOOOOOO***', '.*************.', '..***********..', '...*********...']
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<string> solution(int n) {
int size = 5 * n;
vector<string> grid(size, string(size, '.'));
// Draw the outer border
for (int i = 0; i < n; ++i) {
int dots = n - i;
int stars = size - 2 * dots;
string row = string(dots, '.') + string(stars, '*') + string(dots, '.');
grid[i] = row;
grid[size - 1 - i] = row;
}
// Draw the inner 'O' part
int middle_length = 3 * n;
int o_length = (middle_length - n) / 2;
string left = string(n, '*');
string right = string(n, '*');
string full_O = string(middle_length, 'O');
string with_dots =
string(o_length, 'O') + string(n, '.') + string(o_length, 'O');
for (int i = n; i < 4 * n; ++i) {
if (i < 2 * n || i >= 3 * n) {
grid[i] = left + full_O + right;
} else {
grid[i] = left + with_dots + right;
}
}
return grid;
}
int main() {
cout << (solution(1) ==
vector<string>{".***.", "*OOO*", "*O.O*", "*OOO*", ".***."})
<< endl;
cout << (solution(2) == vector<string>{"..******..", ".********.",
"**OOOOOO**", "**OOOOOO**",
"**OO..OO**", "**OO..OO**",
"**OOOOOO**", "**OOOOOO**",
".********.", "..******.."})
<< endl;
cout << (solution(3) ==
vector<string>{
"...*********...", "..***********..", ".*************.",
"***OOOOOOOOO***", "***OOOOOOOOO***", "***OOOOOOOOO***",
"***OOO...OOO***", "***OOO...OOO***", "***OOO...OOO***",
"***OOOOOOOOO***", "***OOOOOOOOO***", "***OOOOOOOOO***",
".*************.", "..***********..", "...*********..."})
<< endl;
return 0;
}