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

 

1074번: Z

한수는 2차원 배열 (항상 2^N * 2^N 크기이다)을 Z모양으로 탐색하려고 한다. 예를 들어, 2*2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, 2차원 배열의 크기가 2^N * 2^N라서 왼쪽 위에 있는 칸이 하나가 아니라면, 배열을 4등분 한 후에 (크기가 같은 2^(N-1)로) 재귀적으로 순서대로 방문한다. 다음 예는 2^2 * 2^2 크기의 배열을 방문한 순서이다. N이 주어졌을 때, (r,

www.acmicpc.net

 문제 설명 

1

2

5

6

3

4

7

8

9

10

13

14

11

12

15

16

이렇게 배열이있으면 번호 순서대로 Z를 그리며 숫자가 입력된다 작게 Z 그다음에 크게 Z ..

 

 알고리즘 

분할 정복으로 풀었다 

1. 재귀함수를 부를때 좌측상단 -> 우측 상단-> 좌측하단-> 우측하단 순서로 계속재귀호출

2.  num이 2가되었을 때 r,c 를 탐색하였다.

 

 

코드

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
32
33
34
35
36
#include<iostream>
#include <cmath> //pow();
using namespace std;
 
int N, r, c;
int result = 0;
 
void func(int n, int y, int x) {
    if (n == 2) {
        for (int i = y; i < y + n; i++) {
            for (int j = x; j < x + n; j++) {
 
 
                if (i == r && j == c) {
                    cout << result;
                    return;
                }
                result++;
            }
        }
        return;
    }
    else {
        func(n / 2, y, x);// 좌측상단
        func(n / 2, y, x + n / 2); //우측상단
        func(n / 2, y + n / 2, x);//좌측하단
        func(n / 2, y + n / 2, x + n / 2);//우측 하단
        return;
    }
}
int main() {
    cin >> N >> r >> c;
 
    func(pow(2, N), 00);
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

 

'c++ > 백준' 카테고리의 다른 글

백준 13904번 : 과제  (0) 2020.04.13
백준 1629번 : 곱셈  (0) 2020.04.13
백준 12100번 : 2048(easy)  (0) 2020.04.13
백준 1931번: 회의실 배정  (0) 2020.04.09
백준 11000번: 강의실 배정  (0) 2020.04.09
ariz1623