void printSpiral(A, int r, int c, int rows, int cols) { if(A == null || rows < 1 || cols < 1) { System.out.println(); return; } if(rows == 1) { for(int i = 0; i < cols; i++) print(A[r][c+cols-1-i] + " "); } else if(cols == 1) { for(int i = 0; i < rows; i++) print(A[r+rows-1-i][c] + " "); } else { // print bounds for(int i = 0; i < rows-1; i++) print(A[r+rows-1-i][c+cols-1] + " "); for(int i = 0; i < cols-1; i++) print(A[r][c+cols-1-i] + " "); for(int i = 0; i < rows-1; i++) print(A[r+i][c] + " "); for(int i = 0; i < cols-1; i++) print(A[r+rows-1][c+i] + " "); } // recursive printSpiral(A, r+1, c+1, rows-2, cols-2); } def A = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], ]; def B = [ [1, 2, 3], [4, 5, 6], ]; def C = [[1]]; def D = [ [], ]; def E = [ [1], [2], [3], ]; printSpiral(A, 0, 0, A.size, A[0].size); printSpiral(B, 0, 0, B.size, B[0].size); printSpiral(C, 0, 0, C.size, C[0].size); printSpiral(D, 0, 0, D.size, D[0].size); printSpiral(E, 0, 0, E.size, E[0].size); printSpiral(null, -1, -1, 0, 0);