알고리즘
별 찍기 11 (boj 2448)
KyooDong
2020. 6. 3. 22:04
728x90
별 찍기11 문제는 분할정복(Divide and conquer) 기법으로 문제를 해결할 수 있습니다.
삼각형 안에 작은 삼각형이 들어있는 꼴이기 때문입니다.
코드
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#define INF 987654321
int N;
char arr[5000][10000];
void drawTri(int y, int x) {
sprintf(arr[y - 2] + x, " * ");
sprintf(arr[y - 1] + x, " * * ");
sprintf(arr[y] + x, "*****");
}
void draw(int y, int x, int size) {
if (size == 0) {
drawTri(y, x);
return;
}
int width = pow(2, size - 1) * 6;
draw(y, x, size - 1);
draw(y, x + width, size - 1);
draw(y - width / 2, x + width / 2, size - 1);
}
int main() {
scanf("%d", &N);
int size = log2(N / 3);
draw(N, 0, size);
for (int y = 1; y <= N; y++) {
for (int x = 0; x < 2 * N; x++) {
if (arr[y][x] == '\0')
putchar(' ');
else
putchar(arr[y][x]);
}
putchar('\n');
}
return 0;
}