관리 메뉴

Mini

백준 2448 별찍기-10 c++ // 재귀함수, 기저사례는 간단히, 2차원배열 fill 방법 본문

Algorithm/recursion

백준 2448 별찍기-10 c++ // 재귀함수, 기저사례는 간단히, 2차원배열 fill 방법

Mini_96 2023. 9. 27. 14:40

 

https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

 

1. 2차원배열 fill 방법

//2차원 배열 초기화 방법
for (int i = 0; i < n; ++i) {

    fill(a[i], a[i] + n, ' ');
}

 

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

int n;
char a[2500][2500];


//함수정의 : n만큼의 범위에 *-' ' 채워넣기 , 시작좌표 
void go(int n, int y, int x) {
	//기저사례는 최대한 간단히(원소1개만 처리할정도로)
	if (n==1) {

		a[y][x] = '*';
		return;
	}

	//재귀식
	//9칸으로 나눈후 각각칸의 시작좌표를 구했음.
	//단, 중앙인경우는 pass(빈칸)
	//ex)!가 시작좌표임.
	// (0,0) (0,3) (0,6) == (y,x) (y,x+n/3*1) (y,x+n/3*2)
	//! * * ! * * ! * *
	//*
	//*
	//...

	int num = n / 3;
	go(num, y, x);
	go(num, y, x+num*1);
	go(num, y, x+num*2);
	go(num, y+ num * 1, x);
	//go(num, y+num*1, x+num*1); pass(공백)
	go(num, y+ num * 1, x+ num * 2);
	go(num, y+ num * 2, x);
	go(num, y+ num * 2, x+ num * 1);
	go(num, y+ num * 2, x+ num * 2);
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin >> n;

	//2차원 배열 초기화 방법
	for (int i = 0; i < n; ++i) {

		fill(a[i], a[i] + n, ' ');
	}

	go(n, 0, 0);

	for (int i = 0; i < n; ++i) {
		cout << a[i] << "\n";
	}


}