티스토리 뷰

알고리즘/백준

백준 / 1074 Z C++

4567은 소수 2021. 1. 21. 20:32

www.acmicpc.net/problem/1074

 

1074번: Z

한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, N > 1이 라서

www.acmicpc.net

왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래를 Z모양처럼 이어나간다고 할 때 주어진 위치는 몇번째로 가느냐의 문제입니다. n, r, c가 주어졌을 때, 2^n개의 정사각형이 주어지고, 2^(n-1)을 기준으로 4등분합니다. 그리고 주어진 r, c가 

2^(n-1) 과 비교하여 4등분 중 어느 위치에 있는지를 파악하고 r, c값을 변경해주면 됩니다. 

그와 동시에 기준점을 왼쪽 위 첫 번째 수로 잡은 뒤 정사각형 변이 1이 될 때까지 재귀적으로 해쳐나가면 됩니다. 

 

코드는 다음과 같습니다.

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>

using namespace std;

int n, r, c;
int order[2][2] = { {0,1},{2,3} }; // {왼 위, 오른 위},{왼 아래, 오른 아래}

int func(int n, int r, int c, int first) // first : 제일 왼쪽 위의 값 (기준)
{
	if (n == 1)
		return first + order[r][c];

	int half = pow(2, n - 1); // 절반 위치를 기준으로
	int last = pow(2, n); // 정사각형 크기
	int diff = half * half; // 기준 업데이트 용도

	if (r >= 0 && r < half) {
		if (c >= 0 && c < half) {
			return func(n - 1, r, c, first);
		}
		else if (c >= half && c < last) {
			return func(n - 1, r, c - half, first + diff);
		}
	}
	else if (r >= half && r < last) {
		if (c >= 0 && c < half) {
			return func(n - 1, r - half, c, first + diff * 2);
		}
		else if (c >= half && c < last) {
			return func(n - 1, r - half, c - half, first + diff * 3);
		}
	}

}

int main()
{
	cin >> n >> r >> c;
	int result = func(n, r, c, 0);
	cout << result;
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 / 2470 두 용액 C++  (0) 2021.01.22
백준 / 1927 최소 힙 C++  (0) 2021.01.22
백준 / 3055 탈출 C++  (0) 2021.01.20
백준 / 10836 여왕벌 C++  (0) 2021.01.18
백준 / 11437 LCA C++  (0) 2021.01.13
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함