알고리즘 모음(C++)

백준 1074 - Z(C++) 본문

백준

백준 1074 - Z(C++)

공대생의 잡다한 사전 2022. 2. 14. 20:18

문제 링크입니다. https://www.acmicpc.net/problem/1074

 

1074번: Z

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

www.acmicpc.net

재귀를 이용한 문제였습니다.

규칙을 찾는 것이 중요했습니다.

문제 조건
출력 예시

(R , C)까지 모든 경로를 탐색하는 것이 아닌 계속 구역을 나누면서 더해주는 것이 중요합니다.

 

(R,C)가 처음에 몇분면인지, 그리고 얼마를 더해야하는지도 구해봤습니다.

이번에는 4분면으로 다시 나눌때 어떻게 해야하는지를 확인하겠습니다.

 

위의 정보를 이해하면 코드를 쉽게 짤 수 있습니다.

 

 

자세한 것은 코드를 참고해주세요.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <deque>
#include <stack>

using namespace std;

int N, C, R;
int ans;

void solve(int n, int x, int y) {
	if (n == 0) return;
	int Size = pow(2, n);
	int half = Size / 2;
	int num = half * half;
	if (x / half == 0 && y / half == 0) {  // 1사분면일때
		ans += num * 0;
		solve(n - 1, x % half, y % half);
	}
	else if (x / half == 0 && y / half == 1) { // 2사분면일때
		ans += num * 1;
		solve(n - 1, x % half, y % half);
	}
	else if (x / half == 1 && y / half == 0) { //3사분면일때
		ans += num * 2;
		solve(n - 1, x % half, y % half);
	}
	else if (x / half == 1 && y / half == 1) { //4사분면일때
		ans += num * 3;
		solve(n - 1, x % half, y % half);
	}
}

int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> N >> C >> R;
	solve(N, C, R);
	cout << ans;
	return 0;
}

 

 

질문 및 조언 댓글 남겨주세요

'백준' 카테고리의 다른 글

백준 1167 - 트리의 지름(C++)  (0) 2022.02.18
백준 11723 - 집합(C++)  (0) 2022.02.14
백준 7662 - 이중 우선순위 큐(C++)  (0) 2022.02.14
백준 5430 - AC(C++)  (0) 2022.02.13
백준 6064 - 카잉 달력(C++)  (0) 2022.02.13