bluecode-小B的O绘制请求

20 阅读1分钟

问题描述

小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;
}