hwooo
BOJ (C/C++) 1022번: 소용돌이 예쁘게 출력하기 본문
https://www.acmicpc.net/problem/1022
1022번: 소용돌이 예쁘게 출력하기
첫째 줄에 네 정수 r1, c1, r2, c2가 주어진다.
www.acmicpc.net
풀이

움직이는 방향은 (0,1) -> (-1,0) -> (0,-1) -> (1,0) , 오른쪽 -> 위쪽 -> 왼쪽 -> 아래쪽.
1칸씩 이동이 2번, 2칸씩 이동이 2번 ... n칸씩 이동이 2번씩이다.
n칸씩 이동하며 이동한 좌표가 배열 안에 위치했다면 값을 저장하고, 저장한 횟수가 배열의 크기와 같아진다면 출력.
(출력 함수에 저장된 최댓값의 자릿수에 맞춰 출력함 (다른 분들은 배열에 저장된 값과 최댓값을 비교해서 공백 출력하는 분들이 많았어요)
코드
#include <stdio.h>
int A[60][10];
void D(int R, int C, int r, int c);
void Print(int num, int R, int C);
int main() {
int r1, r2, c1, c2, start_x = 0, start_y = 0;
scanf("%d %d %d %d", &r1, &c1, &r2, &c2);
if (!r1 && !r2 && !c1 && !c2) { printf("1"); return 0; }
// 시작 좌표 (0,0)으로 맞춰줌
start_x -= r1, r2 -= r1, r1 -= r1;
start_y -= c1, c2 -= c1, c1 -= c1;
D(r2, c2, start_x, start_y);
return 0;
}
void D(int R, int C, int r, int c) {
int dir_x[4] = { 0,-1,0,1 }, dir_y[4] = { 1,0,-1,0 };
int dir = 0;
int turn = 1, cnt = 1, fill = 0;
if (0 <= r && r <= R && 0 <= c && c <= C) A[r][c] = 1, fill++;
while (1) {
// turn만큼 이동을 2번씩 반복함
for (int k = 0; k < 2; k++) {
// 같은 방향으로 turn만큼 이동
for (int i = 0; i < turn; i++) {
cnt++;
r += dir_x[dir], c += dir_y[dir];
if (0 <= r && r <= R && 0 <= c && c <= C) {
A[r][c] = cnt;
if (++fill == (R + 1) * (C + 1)) return Print(cnt, R, C);
}
}
// 움직일 방향
dir = (dir + 1) % 4;
}
turn++;
}
}
void Print(int num, int R, int C) {
if (num / 10 == 0) {
for (int i = 0; i <= R; i++) {
for (int j = 0; j <= C; j++) printf("%1d ", A[i][j]);
printf("\n");
}
}
else if (num / 100 == 0) {
for (int i = 0; i <= R; i++) {
for (int j = 0; j <= C; j++) printf("%2d ", A[i][j]);
printf("\n");
}
}
else if (num / 1000 == 0) {
for (int i = 0; i <= R; i++) {
for (int j = 0; j <= C; j++) printf("%3d ", A[i][j]);
printf("\n");
}
}
else if (num / 10000 == 0) {
for (int i = 0; i <= R; i++) {
for (int j = 0; j <= C; j++) printf("%4d ", A[i][j]);
printf("\n");
}
}
else if (num / 100000 == 0) {
for (int i = 0; i <= R; i++) {
for (int j = 0; j <= C; j++) printf("%5d ", A[i][j]);
printf("\n");
}
}
else if (num / 1000000 == 0) {
for (int i = 0; i <= R; i++) {
for (int j = 0; j <= C; j++) printf("%6d ", A[i][j]);
printf("\n");
}
}
else if (num / 10000000 == 0) {
for (int i = 0; i <= R; i++) {
for (int j = 0; j <= C; j++) printf("%7d ", A[i][j]);
printf("\n");
}
}
else if (num / 100000000 == 0) {
for (int i = 0; i <= R; i++) {
for (int j = 0; j <= C; j++) printf("%8d ", A[i][j]);
printf("\n");
}
}
else if (num / 1000000000 == 0) {
for (int i = 0; i <= R; i++) {
for (int j = 0; j <= C; j++) printf("%9d ", A[i][j]);
printf("\n");
}
}
}
'Study > Algorithm' 카테고리의 다른 글
BOJ (C/C++) 1075번: 나누기 (0) | 2022.11.30 |
---|---|
BOJ (C/C++) 1308번: D-Day (0) | 2022.11.26 |
BOJ (C/C++) 2028번: 자기복제수 (0) | 2022.11.25 |
BOJ (C/C++) 14494번: 다이나믹이 뭐예요? (0) | 2022.11.25 |
BOJ (C/C++) 1991번: 트리 순회 (0) | 2022.11.25 |