한 변의 크기를 입력 받아 아래와 같이 달팽이 모양으로 회전하는 배열을 출력하는 코드입니다.
1차원 동적할당을 사용하여 2차원 배열같이 응용한 것입니다.
#include <stdio.h> // scanf, printf #include <stdlib.h> // malloc, free int main() { enum {R, D, L, U} go; // 0,1,2,3 - 우,하,좌,상; go는 진행방향 int x = 0, y = 0, size, last_no, i, width = 2; int *arr; printf("한 변의 크기 : "); scanf("%d", &size); last_no = size * size; arr = (int *)malloc(last_no * sizeof(int)); // 동적 할당 for (i = 0; i < last_no; i++) arr[i] = 0; // 배열 초기화 go = R; // 방향을 오른쪽 전진으로 초기화 for (i = 1; i <= last_no; i++) { arr[y*size+x] = i; // 배열에 값 대입 if (go == R) { if (x >= size-1 || arr[y*size+x+1]) go++, y++; else x++; } else if (go == D) { if (y >= size-1 || arr[(y+1)*size+x]) go++, x--; else y++; } else if (go == L) { if (x <= 0 || arr[y*size+x-1]) go++, y--; else x--; } else if (go == U) { if (y <= 0 || arr[(y-1)*size+x]) go++, x++; else y--; } // if (go > U) go = R; // 방향 보정 go %= 4; } if (last_no / 100) width = 3; // 100단위 숫자가 있으면 출력폭을 3으로 for (y = 0; y < size; y++) { // 출력 for (x = 0; x < size; x++) printf("%*d ", width, arr[y*size+x]); printf("\n"); } free(arr); // 동적할당 해제 } |
#include <stdio.h> // scanf, printf #define SIZE 7 int main() { enum {R, D, L, U} go = R; // 0,1,2,3 - 우,하,좌,상; go는 진행방향 int x = 0, y = 0, n = 1; int a[SIZE][SIZE] = {0, }; for ( ; n <= SIZE * SIZE; n++) { a[y][x] = n; // 배열에 값 대입 if (go == R) { if (x >= SIZE-1 || x < SIZE-2 && a[y][x+2] > 0) { go++, y++; if (a[y+1][x] > 0) break; } else x++; } else if (go == D) { if (y >= SIZE-1 || y < SIZE-2 && a[y+2][x] > 0) { go++, x--; if (a[y][x-1] > 0) break; } else y++; } else if (go == L) { if (x == 0 || x >= 2 && a[y][x-2] > 0) { go++, y--; if (a[y-1][x] > 0) break; } else x--; } else if (go == U) { if (y == 0 || y >= 2 && a[y-2][x] > 0) { go++, x++; if (a[y][x+1] > 0) break; } else y--; } // if (go > U) go = R; // 방향 보정 go %= 4; } for (y = 0; y < SIZE; y++) { // 출력 for (x = 0; x < SIZE; x++) { if (a[y][x]) printf("%2d ", a[y][x]); else printf("%2s ", " "); } printf("\n"); } return 0; } | cs |
아래는 더 간단한 알고리즘에 의해 작성된 것입니다.
<출처 : https://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=313946232 >
#include <stdio.h> int main() { int a[15][15] = { 0, }; int num = 1, x = 0, y = 0; int i, j; int size, sign = 1; printf("크기를 입력해주세요(MAX 14) : "); scanf("%d", &size); for (i = 0; i < size; ++i) { a[y][x] = num++; x += sign; } x -= 1; for (i = size - 1;i > 0; --i) { for (j = 0; j < i; ++j) { y += sign; a[y][x] = num++; } sign *= -1; for (j = 0; j < i; ++j) { x += sign; a[y][x] = num++; } } for (i = 0; i < size; ++i) { for (j = 0; j < size; ++j) { printf("%3d ", a[i][j]); } printf("\n\n"); } return 0; } | cs |
다음검색