CAFE

C 프로그래밍

달팽이 배열

작성자별은빛나고|작성시간16.06.29|조회수2,303 목록 댓글 0

한 변의 크기를 입력 받아 아래와 같이 달팽이 모양으로 회전하는 배열을 출력하는 코드입니다.

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 = 0size, 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);                                    // 동적할당 해제                
}

cs






#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] > 0break;
            }
            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> 0break;
            }
            else y++;
        }
        else if (go == L) {
            if (x == 0 || x >= 2 && a[y][x-2> 0) {
                go++, y--;
 
                if (a[y-1][x] > 0break;
            }        
            else x--;
        }
        else if (go == U) {
            if (y == 0 || y >= 2 && a[y-2][x] > 0) {
                go++, x++;
                
                if (a[y][x+1> 0break;
            }
 
            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


다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼