[0447]星を撮る-10
[0447]星を撮る-10
質問する
再帰的なパターンで星を撮りましょう.Nは3の累加二乗(3,9,27.)である.表示、大きさNのパターンはN×n正方形形状.
大きさ3のパターンは真ん中にスペースがあり、真ん中のすべての格子を除いて星のパターンがあります.
***
* *
***
nが3より大きい場合、nサイズのパターンはスペースで塗りつぶされます(N/3).×(N/3)N/3の大きさのパターンで囲まれた正方形.例えば、サイズ27のパターンは、サンプル出力1と同じである.入力
1行目はNです.Nは3の三次方です.すなわち、ある整数kに対して、N=3 kであり、このとき1≦k<8である.
しゅつりょく
1行目からN行目まで星を出力します.
サンプル出力1
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
********* *********
* ** ** * * ** ** *
********* *********
*** *** *** ***
* * * * * * * *
*** *** *** ***
********* *********
* ** ** * * ** ** *
********* *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
コード#コード#
#include <iostream>
using namespace std;
/* 함수 */
// (0, 0) ~ (N - 1, N - 1)을 좌표로 나타냈을 때 *을 찍는 조건
void star(int i, int j, int n) {
// (i/n)과 (j/n)을 3으로 나눴을 때 나머지가 1일 때 빈칸
if ((i/n) % 3 == 1 && (j/n) % 3 == 1) {
printf(" ");
} else if (n < 3) { // 끝까지 위의 경우가 아닐 경우
printf("*");
} else { // 재귀적으로 확인
star(i, j, n / 3);
}
}
int main() {
int N;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
star(i, j, N);
}
printf("\n");
}
}
追加の説明
左上隅を(0,0)、右下隅を(n−1,n−1)座標とした場合、この図は各フェーズ(1,1)が空であることを示している.(図を参照)
したがって、各フェーズで座標が(1,1)であることを確認し、そうでない場合は再帰的な次フェーズで座標を確認し、nが最小単位3より小さい場合(1,1)は「*」を出力する.
ソース:https://www.acmicpc.net/problem/2447
Reference
この問題について([0447]星を撮る-10), 我々は、より多くの情報をここで見つけました https://velog.io/@kkoala/02447-별-찍기-10テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol