https://www.acmicpc.net/problem/1074
1074번: Z
한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을
www.acmicpc.net
분할 정복, 재귀 문제이다.
구간을 4개의 작은 정사각형으로 쪼갠다음 Z순서(왼쪽 위 1, 오른쪽 위 2, 왼쪽 아래 3, 오른쪽 아래 4)로 탐색한다.
Z순서로 탐색하는 모습이다.
해당 구간에 원하는 좌표가 있다면 그 안에서의 분할 탐색을 진행한다.
코드로 보는게 빠를 것 같아 설명을 줄인다..!
#include <iostream>
#include <cmath>
using namespace std;
int N;
int r, c;
int order;
// 큰 것을 작게 쪼갬
// 변의 길이가 2면 더이상 쪼갤 수 없음
void cut(int x, int y, int n) {
// x, y : 현재 사분면의 왼쪽 위 좌표
// 행 열 적합한지?
if (x == c && y == r) {
cout << order;
return;
}
if ((y <= r && r < y + n) && (x <= c && c < x + n)) { // 현재 구간 안에 r,c가 있다면
cut(x, y, n / 2); // 1구간
cut(x + n / 2, y, n / 2); // 2구간
cut(x, y + n / 2, n / 2); // 3구간
cut(x + n / 2, y + n / 2, n / 2); // 4구간
}
else { // 없으면 그 전 재귀로 돌아갈텐데 그 전에
order += n * n; // 안에 있던 순서를 더함
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> r >> c;
cut(0, 0, 1 << N); // 1<<N = pow(2,N)
}
비트 연산자를 애용해야겠다.
'백준' 카테고리의 다른 글
[1891] 사분면 (0) | 2022.11.14 |
---|---|
[2448] 별 찍기 - 11 (0) | 2022.11.13 |
[2630] 색종이 만들기 (0) | 2022.11.08 |
[1406] 에디터 (0) | 2022.11.07 |
[1158] 요세푸스 문제 (0) | 2022.11.06 |
댓글