AD

Creare una matrice spirale in C

Una matrice spirale è un'interessante struttura dati bidimensionale, dove i numeri sono disposti in una spirale che inizia dall'angolo in alto a sinistra e si avvolge verso l'interno in senso orario. Questo tipo di matrice ha applicazioni in vari problemi di programmazione e algoritmi, ed è un ottimo esercizio per migliorare la comprensione dei cicli annidati, della gestione degli indici e delle condizioni di controllo in C.

In questa pagina, vi guideremo attraverso il processo di creazione di una matrice spirale in C, passo dopo passo.

Comprensione della struttura spirale

Prima di iniziare a scrivere il codice, è essenziale comprendere come si forma una matrice spirale. Consideriamo una matrice 4x4 come esempio:

 1  2  3  4

12 13 14  5

11 16 15  6

10  9  8  7

Notate come i numeri inizino da 1 nell'angolo in alto a sinistra, procedano verso destra fino a 4, poi giù verso il basso al bordo destro, e così via in una spirale fino a riempire tutta la matrice.

Algoritmo per creare una matrice spirale

L'algoritmo per creare una matrice spirale coinvolge il mantenimento di quattro indici che rappresentano i limiti della matrice che deve ancora essere riempita: inizioRiga, fineRiga, inizioColonna, fineColonna. La procedura può essere suddivisa in passaggi iterativi, dove in ogni passaggio si riempie il bordo esterno della matrice ancora non riempita e si aggiornano i limiti per la prossima iterazione.

Ecco come potrebbe essere implementata una funzione per creare una matrice spirale in C:

#include <stdio.h> #define R 4 #define C 4 void stampaMatrice(int m[R][C]) {     for (int i = 0; i < R; i++) {         for (int j = 0; j < C; j++)             printf("%2d ", m[i][j]);         printf("\n");     } } void creaMatriceSpirale(int m[R][C], int r, int c) {     int val = 1;     int inizioRiga = 0, inizioColonna = 0;     int fineRiga = r, fineColonna = c;          while (inizioRiga < fineRiga && inizioColonna < fineColonna) {         // Riempimento della prima riga da sinistra a destra         for (int i = inizioColonna; i < fineColonna; ++i)             m[inizioRiga][i] = val++;         inizioRiga++;                  // Riempimento dell'ultima colonna dall'alto al basso         for (int i = inizioRiga; i < fineRiga; ++i)             m[i][fineColonna - 1] = val++;         fineColonna--;                  // Riempimento dell'ultima riga da destra a sinistra         if (inizioRiga < fineRiga) {             for (int i = fineColonna - 1; i >= inizioColonna; --i)                 m[fineRiga - 1][i] = val++;             fineRiga--;         }                  // Riempimento della prima colonna dal basso all'alto         if (inizioColonna < fineColonna) {             for (int i = fineRiga - 1; i >= inizioRiga; --i)                 m[i][inizioColonna] = val++;             inizioColonna++;         }     } } int main() {     int m[R][C] = {0};     creaMatriceSpirale(m, R, C);     printf("Matrice Spirale:\n");     stampaMatrice(m);     return 0; }

Analisi del codice:

  • Definizione delle dimensioni: Le dimensioni della matrice sono definite tramite macro (R e C), rendendo facile modificare la dimensione della matrice spirale.

  • Funzione creaMatriceSpirale: Questa funzione riempie la matrice passata come argomento con valori in ordine crescente in una formazione a spirale. Utilizza quattro variabili (inizioRiga, fineRiga, inizioColonna, fineColonna) per tenere traccia della sub-matrice che deve ancora essere riempita.

  • Cicli di riempimento: In ogni iterazione del ciclo while, la funzione riempie il bordo esterno della sub-matrice corrente e aggiorna i limiti per la prossima iterazione, restringendo progressivamente l'area non ancora riempita.

La creazione di una matrice spirale in C è un esercizio eccellente per praticare la gestione degli array bidimensionali e i cicli annidati. Questo compito non solo migliora la comprensione sul controllo del flusso e sulla manipolazione degli indici ma introduce anche a problemi di programmazione più complessi che richiedono un'attenta pianificazione e un approccio step-by-step alla soluzione.