[PROBLEMA] Matrice con elementi ripetuti C++

#1
Ciao ragazzi,
Devo scrivere un metodo che prende in input una matrice di interi, analizza se c'è un qualsiasi elemento ripetuto in essa e, in tal caso, restituisce true, altrimenti false.
Quindi praticamente se ho una matrice di 3 righe e 4 colonne, questo metodo dovrebbe prendere il primo elemento [0][0] e confrontarlo con tutti fino all'ultimo [2][3]. Finito questo ciclo, prende l'elemento successivo [0][1] e lo controlla con [0][2] e stessa cosa fino al [2][3], così via. Ovviamente una volta trovato un qualsiasi valore ripetuto si può uscire.
Il problema è che non riesco a scrivere un algoritmo al riguardo, in particolare non riesco a gestire gli indici per far ripartire, ad esempio, il controllo dal secondo elemento e senza farlo confrontare con se stesso.

Ho già fatto lo stesso programma, però con un array (qui non ho scritto un metodo, ho fatto direttamente nel main):

C++:
const int N = 10;

int main(){
    int array[N] = {4,9,0,6,58,2,74,70,7,4};
    int k = 0;
    int j = 1;
    bool condizione = false;
    while(k<N) {
        for(int i=0; i<N-j; i++) {
            if(array[k]==array[i+k+1]) {
                condizione = true;
                break;
            }
        }
        k++;
        j++;
    }
    if(condizione==true) {
        cout <<"Nell'array esiste almeno un elemento che si ripete." << endl;
    }
    else
    {
        cout <<"Nell'array non esiste nessun elemento che si ripete.'" << endl;
    }
    return 0;
}
Con una matrice invece non riesco. Potete aiutarmi?
 

rodhellas

Utente Attivo
1,393
375
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
Windows 10 64bit
#2
Si basa tutto sull'usare due variabili per rappresentare colonna e riga attuale. Quando la colonna supera la dimensione massima, ritorna a 0 e incrementi la riga.
 
#4
Esiste anche un metodo a mia vista più semplice utilizzando gli array associativi (HashMap in Java) consiste nello scorrere la matrice e incrementare il valore dell'array utilizzando come indice il valore della matrice. Poi basterà scorrere questo array per vedere se ci sono posizioni con valori > 1.
Codice:
// PSEUDOCODICE
int countArray[] = 0; // tutti gli elementi inizializzati a 0

for (int i=0; i<matrix.length; i++){
    for (int j=0; j<matrix[i].length; j++){
        countArray[matrix[i][j]]++;
    }
}

// Verifica
bool allDifferent = true;
for (int i=0; i<countArray.length; i++){
     if (countArray > 1){
         allDifferent = false;
         break;
     }
}

if (allDifferent){
    //"Non contiene duplicati"
} else {
    //"Contiene duplicati"
}
Con questo metodo hai anche la possibilità di sapere quali sono i duplicati e quante volte compaiono nella matrice.
 
Mi Piace: Jpr0va

Andretti60

Utente Attivo
2,634
1,763
Hardware Utente
#5
Esiste anche un metodo a mia vista più semplice utilizzando gli array associativi (HashMap in Java) ...
In C++ si puo' usare la classe 'map' della Standard Template Library.
E' la maniera piu' veloce e indolore. Il metodo proposto (doppio ciclo sugli elementi della matrice) e' il metodo classico del linguaggio C.

http://www.cplusplus.com/reference/map/map/
Post unito automaticamente:

PS ricordarsi che, qualora si voglia usare il metodo classico, quando si hanno cicli multipli e si esce dai cicli piu' interni occorre uscire anche da quelli piu' esterni, nel caso occorra solo ritornare solo un valore vero/falso.