遇到了一个面试题, 要求顺时针打印数字, 好像在问答里看到过, 但再也没找到

这道题在javaeye上好像见过, 估计是一家公司的面试. 呵呵.
题目要求输入一个大于1的数字, 按顺时针转圈圈打印数字, 打印的数字范围从1到这个数字的平方, 本人苦思半天做了出来, 面试的说代码太长了. 求更简单方法.
如输入数字5, 则打印如下形式的数字
1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

如输入数字6, 则打印如下形式的数字
1 2 3 4 5 6

20 21 22 23 24 7

19 32 33 34 25 8

18 31 36 35 26 9

17 30 29 28 27 10

16 15 14 13 12 11

本人苦思半个多小时的代码, 其中grid的值就是那个输入的数字
public class QuanQuan {

public static void main(String[] args) {        
    int grid = 6;
    int min = 0;
    int max = grid -1 - min;
    int[][] datas = new int[grid][grid];
    int first = 1;      
    while(true) {
        first = printRowFromMinToMax(min, max, min, first, datas);
        first = printColFromMinToMax(min, max, max, first, datas);
        first = printRowFromMaxToMin(min, max, max, first, datas);
        first = printColFromMaxToMin(min, max, min, first, datas);
        min = min + 1;
        max = grid - 1 - min;
        if (min == max) {
            datas[min][max] = first;
            break;
        }
        if (min > max) {
            break;
        }
    }

    for (int[] data:datas){
        for (int d:data) {
            System.out.print(d + "\t");
        }
        System.out.println();
    }

}

public static int printRowFromMinToMax(int minCol, int maxCol, int row, int first, int[][] datas) {
    for (int col=minCol; col<maxCol; col++) {
        datas[row][col] = first;
        first++;
    }
    return first;
}

public static int printRowFromMaxToMin(int minCol, int maxCol, int row, int first, int[][] datas) {
    for (int col=maxCol; col>minCol; col--) {
        datas[row][col] = first;
        first++;
    }
    return first;
}
public static int printColFromMinToMax(int minRow, int maxRow, int col, int first, int[][] datas) {
    for (int row=minRow; row<maxRow; row++) {
        datas[row][col] = first;
        first++;
    }
    return first;
}
public static int printColFromMaxToMin(int minRow, int maxRow, int col, int first, int[][] datas) {
    for (int row=maxRow; row>minRow; row--) {
        datas[row][col] = first;
        first++;
    }
    return first;
}

}

[code="java"]public class Test {
static int n = 10;
static int[][] arr = new int[n][n];

public static void main(String[] args) {
    int x = 0, y = 0;
    for (int i = 1; i <= n * n; i++) {
        arr[x][y] = i;
        if (canSet(x + 1, y) && !canSet(x, y - 1)) {
            x = x + 1;
        } else if (canSet(x, y + 1) && !canSet(x + 1, y)) {
            y = y + 1;
        } else if (canSet(x - 1, y) && !canSet(x, y + 1)) {
            x = x - 1;
        } else if (canSet(x, y - 1) && !canSet(x - 1, y)) {
            y = y - 1;
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            System.out.print(arr[j][i] + " ");
        }
        System.out.println("");
    }
}

private static boolean canSet(int x, int y) {
    if (x < 0 || y < 0 || x >= n || y >= n)
        return false;
    if (arr[x][y] != 0)
        return false;
    return true;
}

}[/code]