AcWing 118. 分形
原题链接
简单
作者:
王小强
,
2021-02-15 11:02:43
,
所有人可见
,
阅读 366
递归解法!
#include <iostream>
#include <vector>
using namespace std;
int n;
// helper function
void print(const vector<vector<char>>& matrix) {
for (const auto& row : matrix) {
for (const auto& c : row) printf("%c", c);
printf("\n");
}
printf("-\n");
}
// 递归求解子问题
vector<vector<char>> solve(int n) {
// recursion exit condition
if (n == 1) {
vector<vector<char>> matrix(1, vector<char>(1, ' '));
matrix[0][0] = 'X';
return matrix;
}
auto matrix = solve(n - 1);
const int sz = matrix.size();
vector<vector<char>> ans(sz * 3, vector<char>(sz * 3, ' '));
// 填充左上角
for (int y = 0; y < sz; ++y)
for (int x = 0; x < sz; ++x)
ans[y][x] = matrix[y][x];
// 填充右上角
for (int y = 0; y < sz; ++y)
for (int x = sz * 2; x < sz * 2 + sz; ++x)
ans[y][x] = matrix[y][x - 2 * sz];
// 填充中间
for (int y = sz; y < sz * 2; ++y)
for (int x = sz; x < sz * 2; ++x)
ans[y][x] = matrix[y - sz][x - sz];
// 填充左下角
for (int y = sz * 2; y < sz * 2 + sz; ++y)
for (int x = 0; x < sz; ++x)
ans[y][x] = matrix[y - 2 * sz][x];
// 填充右下角
for (int y = sz * 2; y < sz * 2 + sz; ++y)
for (int x = sz * 2; x < sz * 2 + sz; ++x)
ans[y][x] = matrix[y - 2 * sz][x - 2 * sz];
return ans;
}
int main(void) {
while (scanf("%d", &n), n > 0)
print(solve(n));
return 0;
}