PROBLEMA Matrice con elementi ripetuti C++

Froggy

Nuovo Utente
8
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 Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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.
 

Jpr0va

Nuovo Utente
32
8
Il programma per la matrice può essere fatto sulla base di quello che hai inserito per gli array, ti basta aggiungere un'altro ciclo che ti permetta di scorrere l'intera riga della matrice.
 

Krona

Nuovo Utente
69
36
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
Reazioni: Jpr0va

Andretti60

Utente Èlite
6,440
5,091
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.
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili