/*
* 어디서 잠깐 봤더니 이걸 달팽이 알고리즘이라고 하더군요.
* 이차원 배열에 숫자를 담는데 달팽이 처럼 뱅뱅 돌면서 숫자를 집어 넣는거죠.
* 예전엔 빡시게 했던 기억이 있었는데 재귀를 사용하니 아주 쉽네요.
*
* 1 2 3 4 5 6 7 8 9
* 32 33 34 35 36 37 38 39 10
* 31 56 57 58 59 60 61 40 11
* 30 55 72 73 74 75 62 41 12
* 29 54 71 80 81 76 63 42 13
* 28 53 70 79 78 77 64 43 14
* 27 52 69 68 67 66 65 44 15
* 26 51 50 49 48 47 46 45 16
* 25 24 23 22 21 20 19 18 17
*/
public class Snail {
static int rowStart, rowEnd = 9, colStart, colEnd = 9, cnt;
static int[][] arr;
public static void main(String[] args) {
arr = new int[rowEnd][colEnd];
cnt = 1;
drawSnail();
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] < 10)
System.out.print(" ");
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
static void drawSnail() {
for (int i = colStart; i < colEnd; i++)
arr[rowStart][i] = cnt++; //가로 우측방향
rowStart++;
if (rowStart >= rowEnd)
return; // 더 이상 진행할 곳이 없음
for (int i = rowStart; i < rowEnd; i++)
arr[i][colEnd - 1] = cnt++; // 세로 아래방향
colEnd--;
for (int i = colEnd - 1; i >= colStart; i--)
arr[rowEnd - 1][i] = cnt++; // 가로 좌측방향
rowEnd--;
if (colStart >= colEnd)
return; // 더 이상 진행할 곳이 없음
for (int i = rowEnd - 1; i >= rowStart; i--)
arr[i][colStart] = cnt++; // 세로 윗방향
colStart++;
drawSnail(); // recursive call
}
}
http://blog.naver.com/PostView.nhn?blogId=whosnext&logNo=100019325077&redirect=Dlog&widgetTypeCall=true
여기서 숫자 줄어드는 걸로 바꾸면 됩니다.
재귀가, 스택구조를 적절하게 이용하는데 좋은거같아. 코드 읽는건 좀 빡쳐도., [from DCHub WP8.0.10211.0]
다만 재귀가 너무 많으면 stack overflow
좌상에서 숫자 x*y부터 시작해 하나씩 줄어드는 걸로 하면 더 편합니다. 가운데 시작 좌표 구할 필요 없습니다.
출력문만 거꾸로 뒤집으면 되지 않을까요?