※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 14600번 문제인 샤워실 바닥 깔기 (Small)이다.
문제는 아래 링크를 확인하자.

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

 

14600번: 샤워실 바닥 깔기 (Small)

첫 번째 줄에는 바닥의 한 변의 길이를 표현하는 자연수 K(1 ≤ K ≤ 2) 가 주어진다. 이때 바닥의 크기는 2K 가 됨에 유의하라. 두 번째 줄에는 배수구의 위치를 나타내는 자연수 x, y (1 ≤ x, y ≤ 2K)

www.acmicpc.net

14601번 문제(링크)에서 입력의 크기가 작아진 문제이다. 해당 글을 참고하여 문제를 해결하자.

 

위와 같은 풀이를 사용하지 않아도, 가능한 입력의 종류가 상당히 적으므로(20가지) 모든 상황의 답을 미리 입력해두는 것으로도 문제를 해결할 수 있다.

 

입력으로 주어지는 좌표가 행과 열 순이 아닌 가로좌표와 세로좌표 순임에 유의하자. 또한, 좌하단의 좌표가 (1,1), 우상단의 좌표가 (2^k,2^k)임에도 유의하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int K;
int ans[4][4];
int num = 1;

void func(int N, int offR, int offC, int R, int C) {
	if (N > 1) {
		if (R < N / 2 && C < N / 2) {
			ans[offR + N / 2][offC + N / 2] = ans[offR + N / 2 - 1][offC + N / 2] = ans[offR + N / 2][offC + N / 2 - 1] = num++;
			func(N / 2, offR, offC, R, C);
			func(N / 2, offR + N / 2, offC, 0, N / 2 - 1);
			func(N / 2, offR, offC + N / 2, N / 2 - 1, 0);
			func(N / 2, offR + N / 2, offC + N / 2, 0, 0);
		}
		else if (R < N / 2 && C >= N / 2) {
			ans[offR + N / 2][offC + N / 2] = ans[offR + N / 2 - 1][offC + N / 2 - 1] = ans[offR + N / 2][offC + N / 2 - 1] = num++;
			func(N / 2, offR, offC, N / 2 - 1, N / 2 - 1);
			func(N / 2, offR + N / 2, offC, 0, N / 2 - 1);
			func(N / 2, offR, offC + N / 2, R, C - N / 2);
			func(N / 2, offR + N / 2, offC + N / 2, 0, 0);
		}
		else if (R >= N / 2 && C < N / 2) {
			ans[offR + N / 2][offC + N / 2] = ans[offR + N / 2 - 1][offC + N / 2 - 1] = ans[offR + N / 2 - 1][offC + N / 2] = num++;
			func(N / 2, offR, offC, N / 2 - 1, N / 2 - 1);
			func(N / 2, offR + N / 2, offC, R - N / 2, C);
			func(N / 2, offR, offC + N / 2, N / 2 - 1, 0);
			func(N / 2, offR + N / 2, offC + N / 2, 0, 0);
		}
		else {
			ans[offR + N / 2][offC + N / 2 - 1] = ans[offR + N / 2 - 1][offC + N / 2 - 1] = ans[offR + N / 2 - 1][offC + N / 2] = num++;
			func(N / 2, offR, offC, N / 2 - 1, N / 2 - 1);
			func(N / 2, offR + N / 2, offC, 0, N / 2 - 1);
			func(N / 2, offR, offC + N / 2, N / 2 - 1, 0);
			func(N / 2, offR + N / 2, offC + N / 2, R - N / 2, C - N / 2);
		}
	}
}

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

	cin >> K;
	int R, C; cin >> C >> R; R--, C--;
	func(1 << K, 0, 0, R, C);

	for (int r = (1 << K) - 1; r > -1; r--) {
		for (int c = 0; c < (1 << K); c++) {
			if (ans[r][c]) cout << ans[r][c] << ' ';
			else cout << -1 << ' ';
		}
		cout << '\n';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2695 // C++] 공  (0) 2023.04.19
[BOJ 2696 // C++] 중앙값 구하기  (0) 2023.04.18
[BOJ 14601 // C++] 샤워실 바닥 깔기 (Large)  (0) 2023.04.16
[BOJ 2250 // C++] 트리의 높이와 너비  (0) 2023.04.15
[BOJ 2290 // C++] LCD Test  (0) 2023.04.14

+ Recent posts