[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