/* Se mostrara una matriz recorrida en forma de espiral, de manera recursiva  NxM  N Filas y M columnas */

import java.util.*;
import java.lang.*;
import java.io.*;

   
class Ideone
{
	static public void espiral(int [][] matriz,int inicio, int filas, int columnas){
	/*CASO BASE*/
	/*Caso Final Recursión*/
	if(inicio > filas ||  inicio > columnas){
		System.exit(0);
	}
	/*Caso solo queda una fila o columna*/
	if(inicio == filas-1){
		for(int k = inicio ;k <= columnas-1; k++){
			System.out.print(matriz[inicio][k]);
		}
		System.exit(0);
	}
	if(inicio == columnas-1){
		for(int k = inicio ;k <= filas-1; k++){
			System.out.print(matriz[k][inicio]);
		}
		System.exit(0);
	}
	
	
	/*CASO GENERAL Imprimira el borde de la matriz*/
		for(int i = inicio ; i < columnas ; i ++){
			System.out.print(matriz[inicio][i]);   /*Imprimir parte superior*/
		}
		for(int j = inicio + 1 ; j < filas ; j++){
			System.out.print(matriz[j][columnas - 1]);   /*Imprimir parte derecha*/
		}
		for(int j = columnas - 1 ; j > inicio; j--){
			System.out.print(matriz[filas - 1][j - 1]);   /*Imprimir parte inferior*/
		}
		for(int i = filas - 1; i > 0 + 1; i--){
			System.out.print(matriz[i - 1][inicio]);   /*Imprimir parte Izquierda*/
		}
		espiral(matriz,inicio + 1,filas -1 ,columnas -1);
	
		
	
	}	
	
	public static void main (String[] args) throws java.lang.Exception
	{
		
		int N = 3;
		int M = 3;
		int [][] matriz = new int[N][M];
		
		for(int i = 0; i < N*M ;i++){
		/*Llenar matriz 1 ciclo*/
			matriz[i/M][(i-(i/M)*M) ] = i; 
		}
		
		
		espiral(matriz,0,N,M);
		
	
		
	}
}