티스토리 뷰

IT/프로그래밍

C언어 snail NxN 버전

NineKY 2007. 7. 6. 15:37
#include <stdio.h>

#define ARR_ROW  30
#define ARR_COL         30
#define ARR_INIT 65535

void printArr(int arr[][ARR_COL]);        // 배열의 내용을 출력하는 함수
void snail(int arr[][ARR_COL]);                // snail 함수

int main()
{
        int array[ARR_ROW][ARR_COL] = {0};
       
        snail (array);
        printArr(array);

        return 0;
}

void printArr(int arr[][ARR_COL])
{
        int i = 0, j = 0;
       
        for(i = 0; i < ARR_ROW; i++)
        {
                for(j = 0 ; j < ARR_COL; j++) printf("%3d ", arr[i][j]);
               
                printf("\n");
        }
}

void snail(int arr[][ARR_COL])
{
        int i = 0, j = 0; // 반복문에서의 인덱스
        int cur_x = 0, cur_y = 0; // 현재의 배열 위치
       
        /* 값의 진행 방향에 대한 정보
         * dir[0] 상(아래->위)
         * dir[1] 하(위->아래)
         * dir[2] 좌(우->좌)
         * dir[3] 우(좌->우) */
        int dir[4] = {0,0,0,1}; // 초기 진행 방향은 좌->우
       
        // 파라메터로 넘어온 배열 초기화 := 모든 값은 ARR_INIT로 세팅
        for(i = 0; i < ARR_ROW; i++)
                for(j = 0; j < ARR_COL; j++) arr[i][j] = ARR_INIT;
               
                // 배열에 값을 입력하는 부분
        for(i = 1; i <= ARR_ROW*ARR_COL; i++)
        {
                        // i값을 배열의 현재 위치에 삽입, i값은 1~25의 값에 해당
                        arr[cur_x][cur_y] = i;
                       
                        // 현재가, 아래에서 위로 진행하고 있는 경우
                        if(dir[0] == 1)
                        {       
                                /* 방향 전이가 이루어지는 경우 확인
                                 * cur_x-1 < 0                                        : 다음 증가 위치가 배열 범위에서 벗어났는지 확인
                                 * arr[cur_x-1][cur_y] <= i                : 이미 지나쳐온 부분인지 확인 */
                                if(cur_x-1 < 0 || arr[cur_x-1][cur_y] <= i)
                                {
                                        dir[0] = 0;
                                        dir[3] = 1;
                                       
                                        cur_y++;
                                }
                                // 계속 진행
                                else
                                        cur_x--;
                        }
                        else if(dir[1] == 1)
                        {
                                // 방향 전이가 이루어지는 경우
                                if(cur_x+1 >= ARR_COL || arr[cur_x+1][cur_y] <= i)
                                {
                                        dir[1] = 0;
                                        dir[2] = 1;
                                       
                                        cur_y--;
                                }
                                // 계속 진행
                                else
                                        cur_x++;
                        }
                        else if(dir[2] == 1)
                        {
                                // 방향 전이가 이루어지는 경우
                                if(cur_y-1 < 0 || arr[cur_x][cur_y-1] <= i)
                                {
                                        dir[2] = 0;
                                        dir[0] = 1;
                                       
                                        cur_x--;
                                }
                                // 계속 진행
                                else
                                        cur_y--;
                        }
                        else if(dir[3] == 1)
                        {
                                // 방향 전이가 이루어지는 경우
                                if(cur_y+1 >= ARR_COL || arr[cur_x][cur_y+1] <= i)
                                {
                                        dir[3] = 0;
                                        dir[1] = 1;
                                       
                                        cur_x++;
                                }
                                // 계속 진행
                                else
                                        cur_y++;
                        }
        }
}

 
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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
글 보관함