VioletaBabel
2448번: 별찍기 - 11 본문
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include<cstdio> void init(int n); void print(int n); void draw(const int cc, const int nn, int n, int c, int cx, int cy); char star[3][7] = { { ' ',' ','*',' ',' ',' ' },{ ' ','*',' ','*',' ',' ' },{ '*','*','*','*','*',' ' } }; char paper[3072][6145]; int main() { int n, c = 0; scanf("%d", &n); init(n); for (int k = n; k != 1; ++c, k /= 2); draw(c, n, n, c, 6, 3); print(n); } void print(int n) { for (int i = 0; i < n; ++i) { for (int j = 0; j < n * 2; ++j) printf("%c", paper[i][j]); printf("\n"); } } void init(int n) { for (int i = 0; i < n; ++i) for (int j = 0; j < n * 2; ++j) paper[i][j] = ' '; } void draw(const int cc, const int nn, int n, int c, int cx, int cy) { if (cc == c) { for (int ky = 0; ky < 3; ++ky) for (int kx = 0; kx < 6; ++kx) paper[ky][kx + nn - 3] = star[ky][kx]; } else if (c > 0) { int xp = 3; for (int kc = cc - c - 1; kc--; xp *= 2); for (int ky = 0; ky < cy; ++ky) // cy=3 for (int kx = 0; kx < cx; ++kx) // cx=6 { paper[ky+cy][kx+nn-xp*2] = paper[ky][kx+nn-xp]; paper[ky+cy][kx+cx+nn-xp*2] = paper[ky][kx+nn-xp]; } cx *= 2; cy *= 2; } if (--c == 0) return; draw(cc, nn, n/2, c, cx, cy); } | cs |
'백준 > 백준-C++' 카테고리의 다른 글
1018번: 체스판 다시 칠하기 (0) | 2018.03.13 |
---|---|
2503번: 숫자 야구 (0) | 2018.03.13 |
2446번: 별찍기 - 9 (0) | 2018.02.06 |
2669번 : 직사각형 네개의 합집합의 면적 구하기 (0) | 2018.02.06 |
1032번: 명령 프롬프트 (0) | 2018.02.05 |
Comments