Creare una matrice spirale in JavaScript

La creazione di una matrice spirale è un esercizio popolare che mette alla prova la comprensione degli algoritmi e delle strutture dati in JavaScript. Una matrice spirale è una matrice in cui i valori sono disposti in una spirale che si snoda verso il centro. Questo compito può sembrare complesso all'inizio, ma con un approccio metodico, possiamo scomporlo in passaggi gestibili.

In questa guida, esploreremo come creare una matrice spirale in JavaScript, passando dalla teoria all'implementazione pratica.

Concetto di matrice spirale

L'idea alla base della matrice spirale è riempire una matrice n×n (o m×n per una versione rettangolare) con numeri che procedono in spirale dall'angolo in alto a sinistra verso l'interno. Il percorso segue un ordine destra, giù, sinistra e su, ripetendosi fino a quando la matrice non è completamente riempita.

Implementazione in JavaScript

Per implementare una matrice spirale in JavaScript, dobbiamo innanzitutto definire la dimensione della matrice e poi inizializzare una matrice vuota. Successivamente, riempiremo la matrice seguendo il percorso spirale.

Definiamo la dimensione della matrice e creiamo una matrice vuota con tutte le entrate inizializzate a zero o un valore placeholder.

function inizializzaMatrice(m, n) {
	return Array.from({ length: m }, () => Array(n).fill(0));
}

Per riempire la matrice in spirale, dobbiamo mantenere traccia dei limiti della spirale: superiore, inferiore, sinistro e destro. Questi limiti cambieranno man mano che riempiamo la matrice.

Utilizzando un ciclo while, possiamo riempire la matrice seguendo il percorso spirale. Ad ogni passo, aggiorniamo i limiti per riflettere la porzione della matrice che rimane da riempire.

function creaMatriceSpirale(m, n) {
	const matrice = inizializzaMatrice(m, n);
	let valore = 1;
	let limiteSinistro = 0;
	let limiteDestro = n - 1;
	let limiteSuperiore = 0;
	let limiteInferiore = m - 1;

	while (limiteSinistro <= limiteDestro && limiteSuperiore <= limiteInferiore) {
		// Riempimento da sinistra a destra
		for (let i = limiteSinistro; i <= limiteDestro; i++) {
			matrice[limiteSuperiore][i] = valore++;
		}
		limiteSuperiore++;

		// Riempimento dall'alto in basso
		for (let i = limiteSuperiore; i <= limiteInferiore; i++) {
			matrice[i][limiteDestro] = valore++;
		}
		limiteDestro--;

		// Riempimento da destra a sinistra
		if (limiteSuperiore <= limiteInferiore) {
			for (let i = limiteDestro; i >= limiteSinistro; i--) {
				matrice[limiteInferiore][i] = valore++;
			}
			limiteInferiore--;
		}

		// Riempimento dal basso all'alto
		if (limiteSinistro <= limiteDestro) {
			for (let i = limiteInferiore; i >= limiteSuperiore; i--) {
				matrice[i][limiteSinistro] = valore++;
			}
			limiteSinistro++;
		}
	}

	return matrice;
}

Dopo aver implementato la funzione, è importante testarla con diverse dimensioni di matrice per verificare che funzioni come previsto.

console.log(creaMatriceSpirale(4, 4));
console.log(creaMatriceSpirale(5, 5));

Questi esempi dovrebbero generare matrici spirale correttamente riempite.

Considerazioni

L'implementazione sopra descritta assume una matrice rettangolare (o quadrata come caso speciale) e riempie la matrice con numeri interi in ordine crescente. Tuttavia, l'approccio può essere facilmente adattato per lavorare con altri tipi di dati o per seguire un diverso schema di riempimento.

Inoltre, mentre questo approccio è relativamente diretto e facile da comprendere, potrebbe non essere il più efficiente per tutte le applicazioni, specialmente per matrici molto grandi. In tali casi, potrebbero essere esplorate ottimizzazioni specifiche.

Conclusione

Creare una matrice spirale in JavaScript è un ottimo esercizio per migliorare la comprensione degli algoritmi e delle strutture dati. Seguendo i passaggi descritti e comprendendo il concetto alla base del problema, possiamo implementare una soluzione che riempie correttamente una matrice in un ordine spirale.