문제 링크 : 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), 0, 0);
}
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 |
문제 링크 : 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), 0, 0);
}
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 |