본문 바로가기

알고리즘/BOJ

1074번

1074번 - Z


처음에는 처음부터 모든 점을 방문하면서, 찾고자 하는 r,c 가 나왔을 때 답을 출력하도록 했더니, 시간초과가 발생했다.


그래서 다 방문하지 않고, r,c를 찾아가는 코드를 분할정복과 재귀를 이용해서 구현했다.


왼쪽 상단, 오른쪽 상단, 왼쪽 하단, 오른쪽 하단 순서로 방문하도록 for문을 이용해서 첫값을 구했다.


그리고 해당하는 점이 사분할 된 곳 중에 어느 곳에 있는지 확인하고, 그 사분면으로 이동하도록 구현했다.


만약 2사분면에 있다면, 1사분면의 모든 갯수를 더한 다음 순서가 되고,


만약 3사분면에 있다면, 1사분면+ 2사분면의 모든 갯수를 더한 다음 순서가 되기 때문에


모든 정점을 방문하지 않고 , 곧바로 목표로 하는 정점으로 방문해도 정답을 구할 수 있기 때문이다.


<정답 코드>


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
37
38
39
40
41
42
43
#include<iostream>
#include<math.h>
using namespace std;
 
int n, r, c, ans, cnt = 0;
int dx[4= { 0,0,1,1 };
int dy[4= { 0,1,0,1 };
void dfs(int sizeint x, int y,int cnt)
{
    if (x == r && y == c)
    {
        cout << cnt << "\n";
        exit(1);
    }
    
    for (int i = 0; i < 4; i++)
    {
        int nsize = size / 2;
        int nx = x + dx[i] * nsize;
        int ny = y + dy[i] * nsize;
 
        if (r >= nx && r < nx + nsize && c >= ny && c < ny + nsize)
        {
            dfs(nsize, nx, ny, cnt + (i*nsize*nsize));
        }
    }
 
 
    return;
}
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
 
 
    cin >> n >> r >> c;
 
    dfs((int)pow(2,n), 00,0);
 
    return 0;
}
cs


반응형

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

7562번  (0) 2018.03.07
1244. 최대 상금  (0) 2018.03.06
2164번  (0) 2018.02.27
9517번  (0) 2018.02.27
1526번  (0) 2018.02.27