2448
2448
Created at : 2024-01-17 16:52
2448
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
void DrawStar11(int n, int h);
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n;
for(int i = 0; i < n; ++i)
{
DrawStar11(n, i);
for(int j = 0; j < n - i; ++j)
cout << ' ';
if(i != n - 1)
{
cout << '\n';
}
}
return 0;
}
void DrawStar11(int n, int h)
{
if(n == 1)
{
if(h == 0)
{
cout << "*";
}
else if(h == 1)
{
cout << "* *";
}
else if(h == 2)
{
cout << "*****";
}
return;
}
int Blank;
if(h < 3)
{
Blank = n - h - 1;
for(int i = 0; i < Blank; ++i)
{
cout << ' ';
}
DrawStar11(1, h);
return;
}
int k = log2(h / 3);
int NextN = 3 * pow(2, k);
int NextH = h - 3 * pow(2, k);
Blank = n - NextN * 2;
for(int i = 0; i < Blank; ++i)
{
cout << ' ';
}
DrawStar11(NextN, NextH);
int pow2k = pow(2, k);
Blank = 6 * pow2k - 1;
Blank /= 2;
Blank -= (NextH - 1);
for(int i = 0; i < Blank; ++i)
{
cout << ' ';
}
DrawStar11(NextN, NextH);
}
내가 재귀를 엄청 못한다는 것은 깨달았다.
다른 버전
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
void DrawStar11(int n, pair<int, int> Start, vector<vector<char>>& Stars);
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k, m;
vector<vector<char>> Stars;
cin >> n;
k = log2(n / 3);
m = 6 * pow(2, k) - 1;
Stars.resize(n);
for(int i = 0; i < n; ++i)
{
Stars[i].resize(m);
for(int j = 0; j < m; ++j)
{
Stars[i][j] = ' ';
}
}
DrawStar11(n, {Stars.size() - 1, 0}, Stars);
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < m; ++j)
{
cout << Stars[i][j];
}
cout << '\n';
}
return 0;
}
void DrawStar11(int n, pair<int, int> Start, vector<vector<char>>& Stars)
{
if(n < 3)
{
return;
}
int k = log2(n / 3);
int m = 6 * pow(2, k) - 1;
int i = Start.first, j = Start.second, Cnt = 0;
while(true)
{
if(Cnt == m)
{
break;
}
if(Cnt % 6 != 5)
{
Stars[Start.first][j] = '*';
}
Stars[i][j] = '*';
++Cnt;
i = Cnt > m / 2 ? i + 1 : i - 1;
++j;
}
DrawStar11(n / 2,Start , Stars);
DrawStar11(n / 2,{Start.first, Start.second + m / 2 + 1} , Stars);
DrawStar11(n / 2,{Start.first - n / 2, Start.second + m / 4 + 1} , Stars);
}
아무리 생각해도 내가 생각한건 직관적이지 않았기에, 인터넷을 뒤적여보니 다들 공통적으로 배열을 선언하고 배열을 채우는 식으로 했다. 메모리는 더 사용 하지만 훨씬 직관적이다.