Calcolo perimetro matrice

di giulysory il
11 risposte
Ciao a tutti, mi sono appena iscritta!
Apro questa discussione perché devo scrivere un algoritmo che mi permetta di calcolare la somma del perimetro (bordo) di una matrice. Prima di scrivere il codice, ragionando in termini di somma degli indici, sono arrivata alla conclusione che:
- Se i=0, devo sommare gli elementi che hanno j che varia da 0 a dim_col-1. (Se 3x3= 0.0 - 0.1 - 0.2)
- Se i=dim_rig-1, devo sommare gli elementi che hanno j che varia da 0 a dim_col-1. (Se 3x3= 2.0 - 2.1 - 2.2)
- Se i è compreso tra 0 e dim_rig-1, devo sommare gli elementi che hanno j=0 e j=j-1. (Se 3x3= 1.0 e 1.2)
Ho provato a scrivere il codice utilizzando i soliti due for per scorrere gli elementi della matrice. Per verificare invece, queste tre condizioni ho aggiunto tre if, così se verificate, viene aggiornato il contatore somma, ma non funziona.
C'è qualcuno disposto a farmi ragionare? Sto sbattendo la testa sulla tastiera da ieri sera
Grazie mille

11 Risposte

  • Vediamo il codice e dicci esattamente cosa vuol dire "non funziona".
  • RICORDA: la soluzione PIU' SEMPLICE E' SEMPRE preferibile.

    La matrice ha QUATTRO lati: alto, basso, sinistra, destra.
    Le celle di ogni lato hanno delle coordinate BEN definite.
    QUINDI ti basta scandire le celle dei suddetti lati.

    ATTENZIONE: c'e' un problemino. Devi gestire OPPORTUNAMENTE le celle negli spigoli!!!

    Ragiona usando un banale foglio a quadretti!
  • Infatti, proprio perché è meglio scrivere un codice ottimizzato non ho scritto la bozza dell'algoritmo che avevo scritto perché ho intuito che ci sia un modo più leggero per poterlo scrivere. Quindi, ritornando al ragionamento, a prescindere dalla dimensione della matrice, il lato sinistro e destro hanno sempre coordinate [0][j] e [c-1] mentre il lato alto e basso hanno sempre coordinate [0][j] e [r-1][j], con i e j che variano da 0 a r-1 e c-1. Se eseguissi quindi, una semplice somma di questi indici all'interno della variabile sum, aggiungerei i quattro lati sì, ma includerei ogni volta anche i quattro angoli, giusto?
  • LASCIA PERDERE il concetto di codice ottimizzato.
    SEMPLICE non e' sinonimo di ottimizzato.
    Per le cose che devi fare deve SOLO essere semplice

    Giusto.
    Ora con qualche neurone in piu' trovi anche la soluzione per gli spigoli
  • Quindi, all'interno dei due cicli for la variabile sum sarà data dalla somma dei quattro angoli M[0][0], M[r-1][c-1], M[r-1][0], M[0][c-1] più la somma dei quattro lati compresi tra gli angoli, ossia M[0][j>0 && j<c-1], M[r-1][j>0 && j<c-1] e così via?
  • Ti bastano due cicli ...

    In uno esplora tutte le colonne (da 0 a c-1) e sommi le righe 0 e r-1

    In un altro esplori i due lati (esclusi gli angoli già considerati), quindi tutte le righe da 1 a r-2 sommando le colonne 0 e c-1

    Puoi provare a scrivere queste due for così vai avanti?
  • 
    //Calcolo perimetro di una matrice quadrata
    
    int perimetro(const int M[][MAX],const int n){
    	int somma=0;
    	for(int i=0;i<n;i++){
    		somma=somma+M[i][0]+M[i][n-1];
    	}
    	
    	for(int j=1;j<n-1;j++){
    		somma=somma+M[0][j]+M[n-1][j];
    	}
    	
    	return somma;
    }	
    
    Okay, grazie mille
  • E' sbagliato il primo for
  • Ok ora va bene.

    Non modificate i post precedenti, che poi passano gli altri e dicono che scrivo cavolate

    Scherzo fate pure
  • Ahahahaha non lo faccio più
    Comunque, grazie a tutti per la disponibilità :3
  • Un unico appunto (ma è proprio un dettaglio): se n = 1 il risultato è sbagliato. Dovresti fare subito all'inizio
    if(n==1) 
    	return M[0][0];
Devi accedere o registrarti per scrivere nel forum
11 risposte