#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;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
숫자 마름모 (0) | 2014.04.02 |
---|---|
문자열안의 문자정렬 (0) | 2014.04.02 |
하노이탑 이해하기 (0) | 2014.03.27 |
큰 정수의 제곱근의 정수값 구하기(정수연산 만으로) (0) | 2014.03.24 |
파스칼의 삼각형(2차원 배열) (0) | 2014.03.21 |