#define xx 4 #define yy 5 void main() { int arr[yy][xx] = {0}; int su = 1, to[2] = {0}; int cnt; int x = 0, y = 0; for(cnt = 0; cnt < (xx * yy); cnt++) { arr[y][x] = cnt + 1; if((to[0] == 0) && (to[1] == 0)) // x방향 증가 { x++; if((x == xx) || (arr[y][x] != 0)) { x--; cnt--; to[0] = 1; to[1] = 0; } } else if((to[0] == 1) && (to[1] == 0)) // y방향 증가 { y++; if((y == yy) || (arr[y][x] != 0)) { y--; cnt--; to[0] = 0; to[1] = 1; } } else if((to[0] == 0) && (to[1] == 1)) // x방향 감소 { x--; if((x == -1) || (arr[y][x] != 0)) { x++; y--; to[0] = 1; to[1] = 1; } } else if((to[0] == 1) && (to[1] == 1)) // y방향 감소 { y--; if(arr[y][x] != 0) { y++; x++; to[0] = 0; to[1] = 0; } } } for(cnt = 0; cnt < (xx * yy); cnt++) { x = cnt % xx; y = cnt / xx; if(((cnt % xx) == 0) && (cnt != 0))printf("\n"); printf("%d\t", arr[y][x]); } printf("\n"); }
프로그램 실행화면
달팽이 배열을 만드는 프로그램이다. 생각보다 조금 복잡하다. 큰 틀로 봤을 때, [x방향 증가] [y방향 증가] [x방향 감소] [y방향 감소] 이 순서가 계속해서 반복된다.
방향과 증감을 to[2]배열로 관리를 했지만 사실은 변수 하나를 선언해 0 1 2 3 을 반복해 나가면서 실행하도 상관은 없지만 조금 있어보이기도 하고 명확히 하기 위해서 to[2]배열을 선언해 사용하였다.
프로그램 제일 상단에 있는 #define을 통해 배열의 크기를 조절할 수 있다. for문의 구현 내용은 x, y 증감에 관한 if문만 잘 살펴보면 쉽게 이해되리라 생각된다.