Matrice in C

abaco90
Ciao a tutti,

devo realizzare una funzione magic_square che, data una matrice m in forma linearizzata e la sua dimensione (positiva) n, restituisce 1 se la matrice è un quadrato magico, 0 altrimenti.

Una matrice quadrata è un quadrato magico se la somma degli elementi presenti in ogni riga, in ogni colonna ed in entrambe le diagonali è sempre lo stesso numero.

Dichiarazione della funzione: int quadrato_magico(int m[], int n)

Esempi:

magic_square ({31, 73, 7, 13, 37, 61, 67, 1, 43}, 3) restituisce 1;
magic_square ({1, 4, 7, 2}, 2) restituisce 0;
magic_square ({1}, 1) restituisce 1.

Il fatto che si tratti di una matrice linearizzata mi mette abbastanza in difficoltà in quanto non so gestire la posizione dei vari elementi. Qualcuno può darmi una mano? Grazie!

Risposte
apatriarca
La posizione dell'elemento \((i,j)\) (in cui gli indici partono da \(0\)) è \( i\,N + j \) se la matrice ha dimensione \(M \times N\). Se ti da fastidio lavorare con le matrici linearizzate puoi scriverti una funzione per ottenere il valore dati gli indici oppure usare una macro.
// macro
#define M(m, n, i, j) ((m)[(i)*(n) + (j))
// funzione
int get(int m[], int n, int i, int j)
{
    return m[i*n + j];
}


In alternativa puoi limitare ad una singola funzione come la seguente la complessità di accedere ai valori di una matrice e poi usare tale funzione per calcolare le somme.
/* Somma \n\ valori separati da \stride\ valori in un array partendo dall'elemento \start\. */
int sum(int m[], int start, int n, int stride)
{
    int sum = 0;
    for (int i = 0; i < n; ++i) {
        sum += m[i*stride + start];
    }
    return sum;
}

A questo punto hai che per sommare il valore della riga \(i-\)esima devi semplicemente scrivere:
sum(m, i*n, n, 1);

Per sommare la colonna \(j-\)esima devi invece scrivere
sum(m, j, n, n);

Le diagonali si possono invece ottenere con le due seguenti chiamate alla funzione:
// principale
sum(m, 0, n+1, n);
// secondaria
sum(m, n-1, n-1, n);

Ti lascio come esercizio quello di verificare che effettivamente queste funzioni fanno quello che stai cercando.. Ovviamente potrebbe essere più semplice scrivere direttamente il codice usando la funzione o la macro che ho scritto inizialmente.

abaco90
Ok ora provo, grazie mille della tua disponibilità!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.