Matrice in C

Messaggioda abaco90 » 04/03/2017, 15:58

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!
abaco90
Junior Member
Junior Member
 
Messaggio: 86 di 400
Iscritto il: 01/11/2016, 17:38

Re: Matrice in C

Messaggioda apatriarca » 06/03/2017, 01:42

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.
Codice:
// 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.
Codice:
/* 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:
Codice:
sum(m, i*n, n, 1);

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

Le diagonali si possono invece ottenere con le due seguenti chiamate alla funzione:
Codice:
// 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.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4565 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Matrice in C

Messaggioda abaco90 » 08/03/2017, 17:34

Ok ora provo, grazie mille della tua disponibilità!
abaco90
Junior Member
Junior Member
 
Messaggio: 88 di 400
Iscritto il: 01/11/2016, 17:38


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite