c·c++/c 프로그래밍

while문 1개로 짠 골뱅이(달팽이) 배열

바로이순간 2014. 3. 31. 17:04

#include <stdio.h>  

int main() {

    // 달팽이를 위한 2차원 배열

    int data[30][30]={0,};  


    // 줄을 나타내는 i, 칸을 나타내는 j, 들어가는 수를 나타내는 k,

    // n은 배열의 크기를 나타낸다.


    int i, j, k, n;


    // di, dj는 방향을 나타낸다. i값이 증가하는 값이 di, j값이 증가하는 값이 dj이다.

    // 처음에 오른쪽으로 가기 때문에 di는 0이고 dj는 1이다.


    // dd는 di, dj의 값이 서로 바뀔때 부호가 바뀌는 장소를 나타낸다.

    // 처음에는 (0,1) 이 (1,0) 이 되고 (0,-1)이 되어서 (-1,0)이 되고 다시 처음으로 돌아간다.

    // 두 값이 서로 바뀌는 동안 :: 부호안바뀜, 부호바뀜, 부호안바뀜, 부호바뀜이 반복이 된다.


    // 이를 나타내기 위해서 사용한 변수가 dd이다.

    // dd가 짝수이면 부호가 바뀌지 않고, dd가 홀수이면 부호가 바뀐다.


    // s=1-2*(dd%2); 가 바로 이것이다 dd의 값이 홀수이면 dd%2가 1이 되어서 s의 값은 -1이 된다.

    // dd의 값이 짝수일 때는 s의 값이 1이된다. 따라서 부호가 바뀌는 경우와 바뀌지 않는 경우를

    // dd값을 바꾸어 가면서 제어할 수 있다.


    // s는 부호 바뀜, t는 di, dj의 값을 바꿀 때 사용할 임시변수이다.


    // x, y는 한번에 진행하는 갯수를 제어하기 위해서 사용한다.

    // n이 10일 경우 처음에는 (10, 9, 9, 8) 다시 (8, 7, 7, 6), 과 같은 방식으로 변한다.


    // 이를 나타내기 위해서 x=n+n; 으로 주고 x의 값을 1씩 감소시켜간다.

    // x/2의 값을 구하면 10, 9, 9, 8, 8, 7, 7, 처럼 변하도록 할 수가 있다.


    // y는 x/2까지 변하는갯수를 제어하기 위한 변수이다.

    // y==x/2가 되면 x의 값을 1감소시키고,

    // y의 값이 0이 되고, dd의 값이 1증가시키고, 이에 따라서 s의 값을 계산한 다음

    // di, dj의 값을 서로 바꾸어 준다. 


    int di=0, dj=1, dd, s, t, x, y;


    printf("n= ");

    scanf("%d", &n);

    i=0;

    j=0;

    k=0;

    x=n+n;

    dd=1;

    y=0;


    // 값을 넣는 부분은 한개의 while문으로 되어 있다.

    while(x>1) {

        data[i][j]=(k+=1);

        y+=1;

        if(y==x/2) {

            x-=1;

            y=0;

            dd+=1;    

            s=1-2*(dd%2);

            t=di;

            di=s*dj;

            dj=s*t;

        }

        i+=di;

        j+=dj;

    } 


    // 아래 부분은 값을 출력하는 부분이다.

    for(i=0;i<n;i+=1) {

        for(j=0;j<n;j+=1) {

            printf("%4d", data[i][j]);

        }

        printf("\n");

    }


    return 0;  

}