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

 

1022번: 소용돌이 예쁘게 출력하기

첫째 줄에 r1, c1, r2, c2가 주어진다. 모두 절댓값이 5000보다 작거나 같은 정수이고, r2-r1은 0보다 크거나 같고, 49보다 작거나 같으며, c2-c1은 0보다 크거나 같고, 4보다 작거나 같다.

www.acmicpc.net

 

 문제설명 

 

1.주어진 조건에 맞추어 소용돌이를 출력하면 된다

 

 

 알고리즘 

 

1.수 네 개가 주어지면 절대값이 가장큰수 * 2 +1 을 이용하여 최대 숫자를 구한다.

) 가장 큰 숫자가 4 -> 숫자범위 4*4+1 = 9 * 9 = 81 -> 1 ~ 81 까지 숫자가들어감

 

2. 소용돌이에 숫자를 입력 하는 방식은 다음 규칙을 이용하여 입력한다.

3. 주어진 범위내에서 출력이 필요한 부분만  배열에 입력 할 수 있도록한다.

 

  3-1 )만약 배열 을 arr[5001][5001] 을 만들어서 소용돌이를 모두 구한뒤 범위를 입력하여 출력하는 방식은 메모리초과          를  유발 할 수 있다. 

 

4. 출력시 가장큰 수를 기준으로 필요한 띄어쓰기 횟수를 구하여 띄어쓰기 와 함께 출력한다.

 

 코드 

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string>
using namespace std;
 
 
int func(int n) {
    if (n / 10 == 0)return 1;
    else if (n / 100 == 0)return 2;
    else if (n / 1000 == 0)return 3;
    else if (n / 10000 == 0)return 4;
    else if (n / 100000 == 0)return 5;
    else if (n / 1000000 == 0)return 6;
    else if (n / 10000000 == 0)return 7;
    else if (n / 100000000 == 0)return 8;
    else if (n / 1000000000 == 0return 9;
}
 
 
int main() {
    int a, b, c, d;
    long arr[51][6];
 
    cin >> a >> b >> c >> d;
 
    int arr_len = max(abs(a), max(abs(b), max(abs(c), abs(d))));
 
    int y = 0;
    int x = 0;
    int num = 1;
 
    int dir = 0;// 동쪽
    int cnt = 1;
 
    int count = (arr_len + arr_len + 1* (arr_len + arr_len + 1);
 
 
    //1 입력
    if (y >= a && y <= c && x >= b && x <= d)
        arr[y -a][x -b] = num;
 
    num++;
 
    for (int i = 1; i < count; i) {
 
        //dir =4 -> 동쪽이므로 dir=0으로 갱신
        if (dir == 4) dir = 0;
 
        for (int j = 0; j < cnt; j++) {
            if (dir == 0) {
                x++;
            }
            else {
                x--;
            }
            if (y >= a && y <= c && x >= b && x <= d)
                arr[y - a][x - b] = num;
            num++;
            i++;
        }
        //방향전환
        dir++;
 
        for (int j = 0; j < cnt; j++) {
            if (dir == 1) {
                y--;
            }
            else {
                y++;
            }
            if (y >= a && y <= c && x >= b && x <= d)
                arr[y - a][x - b] = num;
            num++;
            i++;
        }
 
        //방향전환
        dir++;
        //방향으로 나아가는 횟수 증가
        cnt++;
    }
 
 
 
    long max_num = 0;
    for (int i = 0; i <= abs(c - a); i++) {
        for (int j = 0; j <= abs(d-b); j++) {
            max_num = max(max_num, arr[i][j]);
        }
    }
    int back = func(max_num);
 
    
    for (int i = 0; i <= abs(c-a); i++) {
        for (int j = 0; j <= abs(d-b); j++) {
            string str = "";
            int c = func(arr[i][j]);
    
 
            for (int i = 0; i < back - c; i++) {
                str.push_back(' ');
                
            }
 
            cout << str << arr[i][j] << " ";
 
        }
        cout << endl;
    }
 
 
}
cs

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

백준 1713번: 후보 추천하기  (0) 2020.05.27
백준 10815번 : 숫자 카드  (0) 2020.05.27
백준 2792번 : 보석상자  (0) 2020.05.27
백준 3020번: 개똥 벌레  (0) 2020.05.27
백준 10942번 : 팰린드롬?  (0) 2020.05.26
ariz1623