BOJ/재귀

2448번: 별 찍기 - 11 (BOJ C/C++)

둠치킨 2022. 8. 30. 22:41

2448번: 별 찍기 - 11

사용 언어: C++

 

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

 

풀이

#include <bits/stdc++.h>
using namespace std;

const int MAX = 3074;
char board[MAX][MAX*2 -1];

void func(int n, int x, int y){
    if(n==3){
        //윗 부분 삼각형
        board[x][y] = board[x+1][y-1] = board[x+1][y+1] = '*';
        //윗 부분 삼각형 밑의 5별 받침대
        for(int i=y-2; i<=y+2; i++)
            board[x+2][i] = '*';
        return;
    }
    int half = n/2;
    func(half, x, y);
    func(half, x+half, y-half);
    func(half, x+half, y+half);
}

int main(void){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n;
    cin >> n;
    for(int i=0; i<n; i++)
        fill(board[i], board[i]+n*2-1, ' ');
    func(n,0,n-1);
    for(int i=0; i<n; i++){
        for(int j=0; j<n*2-1; j++){
            cout << board[i][j];
        }
        cout << '\n';
    }

    return 0;
}