문제링크 :https://www.acmicpc.net/problem/1022
문제설명
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 == 0) return 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 |