(1)-> | (1)-> | (1)-> | (1)-> | (1)-> |
(~2)↑ | (1)-> | (1)-> | (1)-> | (2)↓ |
(~2)↑ | (~2)↑ | (1)-> | (2)↓ | (2)↓ |
(~2)↑ | (~1)<- | (~1)<- | (~1)<- | (2)↓ |
(~1)<- | (~1)<- | (~1)<- | (~1)<- | (~1)<- |
위 표는 5*5 행렬에서 배열을 순환하면서 어떻게 초기화 할지에 대한 내용이다.
(1) 은 오른쪽으로만, (~1) 은 왼쪽으로만
(2) 는 아래로만, (~2) 는 위로만 움직이는 반복문을 의미한다.
여기서 반복의 횟수가 중요한데,
(1) (~1) 은 5, 3, 1
(2) (~2) 는 3, 1
이다.
void snail(int ** board, int n)
{
int n2 = n * n;
int len = n;
int x = -1, y = -1, cnt = 0;
for (int val = 1; val <= n2; len -= 2)
{
for (x += 1, y += 1, cnt = 0; cnt < len; cnt++)
board[y][x++] = val++;
for (x -= 1, y += 1, cnt = 0; cnt < len - 2; cnt++)
board[y++][x] = val++;
for (cnt = 0; cnt < len; cnt++)
board[y][x--] = val++;
for (x += 1, y -= 1, cnt = 0; cnt < len - 2; cnt++)
board[y--][x] = val++;
}
}
n2 는 n의 제곱승을 말하며, 이는 배열의 중앙의 놓이는 값이다.
첫번째 for문은 오른쪽으로만 이동하는 반복문이다.
두번째 for문은 아래로만 이동하는 반복문이다. 첫번째 for문이 종료되었을 때, x값은 배열의 범위를 벗어난다.
이를 보정하기 위해 x -= 1을 하는 것이다. 또한 y += 1 을 하여 밑으로 내려보낸다.
세번째 for문은 왼쪽으로만 이동하는 반복문이다. 두번째 반복문이 종료되었을때는 배열의 범위를 벗어나지 않기
때문에 y값을 그대로 사용하면된다.
마지막 for문은 위로만 이동하는 반복문이다.
'알고리즘' 카테고리의 다른 글
Graph, DFS and BFS (0) | 2021.10.27 |
---|---|
병합정렬 (0) | 2021.10.27 |
삽입정렬 (0) | 2021.10.27 |
소인수분해 (0) | 2021.10.27 |
최대공약수, 최소공배수 (0) | 2021.10.27 |