Matrice in C
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!
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
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.
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.
A questo punto hai che per sommare il valore della riga \(i-\)esima devi semplicemente scrivere:
Per sommare la colonna \(j-\)esima devi invece scrivere
Le diagonali si possono invece ottenere con le due seguenti chiamate alla funzione:
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.
// 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.
Ok ora provo, grazie mille della tua disponibilità!