어느분이 질문해 주셔서
제 답변을 그대로 복사해서 올려요.
행렬에 대해서 알고 계시죠?
달팽이배열은 제일 먼저 열부분으로 증가합니다.(-> 을 의미하는 겁니다)
그리고 다시 행부분으로 증가합니다(아래 방향을 의미합니다.)
행부분이 변하는 곳에서는 한 번씩 계산 횟수를 줄여야 합니다.
잘 생각해보면 압니다.
시작포인트 1 2 3 4 //열부분은 4번 변합니다.
------------------------5 행부분은 3번 변해야 하지요
------------------------6
------------------------7
이렇게 한번씩 열과 행으로 증가하고 나면 다시 반대방향으로 갑니다.
열이 감소하고 그 다음 행이 감소하지요. 아래 코딩에서 inc*=-1 이 부분입니다.
열과 행이 감소하고 나면 다시 증가하지요.(inc는 증가량을 의미합니다.)
기본적으로 이런 알고리즘이고
자세한 코딩은 밑에 짜놨습니다.
제말에 조금 힌트를 얻고 짜보시면 될 겁니다.
안되면 밑에 코딩을 살짝 참고해 보시고요
밑에는 제가 짠 코드입니다. 다행히 얼마전에 c복습하면서 짜둔것이 있네여
#include "stdafx.h"
#include "stdlib.h"
void snail(int **list,int n);
void main()
{
int **list,i,n,j; //포인터와 일반변수를 같이 선언하는 것은 지양해야하지만 여기서는 그냥
scanf("%d",&n);
list =(int**)malloc(n*sizeof(int*));
for(i=0;i<n;i++) //2차원 배열 메모리의 할당.
list[i] =(int*)malloc(n*sizeof(int));
snail(list,n); //list를 달팽이 배열을 만드는 함수의 출력;
for(i=0;i<n;i++){ //출력문
for(j=0;j<n;j++)
printf("%2d ",list[i][j]);
printf("\n");
}
}
void snail(int **list,int n){
int count,i=0,j=-1,inc=1,num=1; //i는 행을 j는 열을. inc는 i나 j값이 증가하는지
//감소하는지를 결정한다. num은 배열에 삽입될 숫자
int max=n*n+1;// max는 num이 최대값에 도달했을때 while문을 멈추기위한
while(1){
for(count=0;count<n;count++){// 열이 변하는 구문
j+=inc; //j값을 1씩 증가하거나 감소한다. 처음에는 증가시킨다.
list[i][j]=num++; // num을 대입.
}
if(max==num) break; //달팽이 배열이 완성되면 while문을 멈추게 한다.
n--; //행이 변하는 구문부터는 1번 덜 실행된다.
for(count=0;count<n;count++){//행이 변하는 구문
i+=inc;
list[i][j]=num++;
}
inc*=-1; //열과 행을 증가시키고 나면 그 다음부터 감소가 된다. 감소가 되면 다시 증가가 됨
}
}