아래와 같은 5x5 달팽이 모양 사각형을 만들어보자.

* 문제를 푸는 방법에는 여러가지 유형이 있다. 다음은 그중 한가지이다.

우선 내부의 숫자가 채워진 방향을 살펴보면

①~④의 순서대로 채우고, 이것을 채우는 횟수가 0 이 될때 까지 반복한다.

a[6][6] = a[1][1]부터 채우기 위해 6행 6열을 준비했다.
k=0 - 채워질 숫자
x=1, y=0 - 채울 행, 열
변수는 이렇게 준비한다.

①은 5번, a[1][1]부터 차례로 채운다.
a[x][++y] = ++k; 이렇게 하면 x=1 이고 , y는 전치증가연산을 사용해 1 이 된다. 또한 k도 전치증가연산을 하여 1 이 되고 a[x][y]에 저장된다.
따라서 a[1][1]=1, a[1][2]=2, a[1][3]=3, a[1][4]=4, a[1][5]=5 이렇게 채워진다.

②은 4번 a[1][5]부터 차례로 채운다. 단 이번에는 5번이 아닌 4번임을 주의한다.
a[++x][y]=++k; 이렇게 하면 y=5 이고 , x는 전치증가연산을 사용해 2가 된다. 또한 k도 전치증가연산을 하여 6 이 되고 a[x][y]에 저장된다.
따라서 a[2][5]=6, a[3][5]=7, a[4][5]=8, a[5][5]=9 이렇게 채워진다.

③은 4번 a[5][5]부터 ①과 반대 방향으로 차례로 채운다.
a[x][--y]=++k; ①과 반대 방향이므로 x=5 이고 , y는 전치감소연산을 사용해 4 가 된다. 또한 k도 전치증가연산을 하여 10 이 되고 a[x][y]에 저장된다.
따라서 a[5][4]=10, a[5][3]=11, a[5][2]=12, a[5][1]=13 이렇게 채워진다.

④는 3번 a[5][1]부터 ②와 반대 방향으로 차례로 채운다. 단 이번에는 4번이 아닌 3번임을 주의한다.
a[--x][y]=++k; ②와 반대 방향이므로 y=1 이고 , x는 전치감소연산을 사용해 4가 된다. 또한 k도 전치증가연산을 하여 14가 되고 a[x][y]에 저장된다.
따라서 a[4][1]=14, a[3][1]=15, a[2][1]=16 이렇게 채워진다.

이와같은 방식으로 반복횟수가 0 이 될때 까지 계속 진행한다.

소스)

int a[6][6]={0}, n=5;
int i, x=1, y=0, k=0;

for (::)
{
	// 1번 가로 채우기
	for (i=1; i<=n; i++)
	{
		a[x][++y]=++k;
	}

	// 2번 세로 채우기
	n--;	// 반복횟수 1감소
	if (n<=0) break;
	for (i=1; i<=n; i++)
	{
		a[++x][y]=++k;
	}

	// 3번 가로 채우기
	for (i=1; i<=n; i++)
	{
		a[x][--y]=++k;
	}

	// 4번 세로 채우기
	n--;	// 반복횟수 1감소
	if (n<=0) break;
	for (i=1; i<=n; i++)
	{
		a[--x][y]=++k;
	}
}

Posted by 파이군
,