Questa è la mia versione, non ricorsiva.

Ho usato un int al posto dell'enum perchè mi dava strani errori... ma non è per niente difficile sostituirlo.

codice:
#include <iostream>
#include <cstdlib>

using namespace std;

void fill_matrix(int*, int);
void disp_matrix(int*, int);

struct point
{
    int x,y;
    // costruttore per inizializzare
    point() {x=0; y=0;}
};     
    
int main()
{
    int n;
    cout << "Larghezza = altezza = ? ";
    cin >> n;
    int *matrice = new int[n*n];
    fill_matrix(matrice, n);
    disp_matrix(matrice, n);
    system("pause");
    return 0;
}    

void fill_matrix(int *mtx, int n)
{
    // x e y correnti
    point a;
    int tot_line_len = n;
    int mancano = tot_line_len;
    // 0=destra
    // 1=giù
    // 2=sinistra
    // 3=su
    int direz = 0;
    int i;

    for(i=1; i<=n*n; i++)
        {     
            // Scrivo il numero nella posizione corrente
            mtx[a.y*n + a.x] = i;
            // La lunghezza che mi manca diminuisce
            mancano--;
            // Se sono al limite cambio direzione
            if(mancano==0)
            {
                direz = (direz+1) % 4;
                if(direz % 2)
                    mancano = --tot_line_len;
                else
                    mancano = tot_line_len;
            }    
            switch(direz)
            {
                // Mi sposto a seconda della direzione
                case 0:
                     a.x++;
                     break;
                case 1:
                     a.y++;
                     break;
                case 2:
                     a.x--; 
                     break;
                case 3: 
                    a.y--; 
                    break;
            }   
            // Prossimo punto! Ora incrementerà il numero da scrivere (i)
        }    
    
}

void disp_matrix(int *mtx, int n)
{
    cout << endl << endl << endl << endl;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            cout<< mtx[i*n + j]<<'\t';
        }
        cout << endl << endl << endl << endl;
    }        
}