문제 분석
https://www.acmicpc.net/problem/2447
별 찍기 문제이지만, 규칙이 정해져 있으므로 재귀로 구현해야 한다.
해결 방법
N에 따라서 균등하게 9등분이 가능하다. 9등분을 하며 재귀호출을 하고, 5번 째 조각일 경우에 호출을 건너뛰면 된다.
base case는 n이 1일 때, 즉 더이상 나눌 수 없을 때 이다.
코드
#include <iostream>
#include <utility>
using namespace std;
char board[2188][2188]; // 3^7 == 2187
void func(int x, int y, int n) {
if(n == 1) {
board[x][y] = '*';
}
else {
int div = n/3;
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
if(i==1 && j==1) continue;
func(x + i*div, y + j*div, div);
}
}
}
}
int main() {
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, ' ');
func(0,0,n);
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
cout << board[i][j];
}
cout << "\n";
}
}
'BOJ > 백트래킹 || 재귀' 카테고리의 다른 글
[C++] BOJ 1941 / 백트래킹 (소문난 칠공주, next_permutation 사용) (0) | 2021.08.02 |
---|---|
[C++] BOJ 9663 / 백트래킹 (N-Queen, 2차원 배열 속 대각선 계산) (0) | 2021.07.29 |
[C++] BOJ 15649 / 백트래킹 (M과 N(1), 백트래킹 첫 도전) (0) | 2021.07.29 |