Esercizio sugli array a due dimensioni

giuliomontenero
l'esercizio dice:
Scrivere una funzione C++ che, dato un array a due dimensioni N x N di interi a ed un intero positivo k>=2, restituisce true se esiste un numero intero n che occorre almeno k volte in esattamente k righe di a, e false altrimenti.

ecco il mio programma, non dà errori ma all'esecuzione qualsiasi k metto mi dice sempre che la condizione è verificata
io praticamente ho creato due funzioni, di cui una mi calcola le occorrenze in una singola riga e vede se sono almeno k, la seconda mi va a vedere se le occorrenze si ripetono in esattamente k righe di a.
potreste aiutarmi?
#include<iostream>
#include<string>
using namespace std;
const int N=7;
bool condizione(int [N][N],int ,int ,int );
bool occorrenze(int [N][N],int ,int );
int main()
{
    int n;
    int a[N][N]={{1,2,3,1,1,5},{4,1,1,2,1,8,8},{4,3,1,9,7,6,1},{7,1,1,1,1,8,8},{3,4,5,6,2,1,8},{2,1,1,9,1,1,7},{1,1,1,1,2,2,3}};
    int k;
    cout<<"Inserire un numero "<<endl;
    cin>>k;
    for(int r=0;r<N;r++)
    {
        for(int j=0;j<N;j++)
        {
            a[r][j]=n;
        }
    }
    if(occorrenze(a,k,n))
    cout<<"non  ";

    cout<<" è verificata la condizione dell'esercizio"<<endl;

return 0;
}

bool condizione(int a[N][N],int k,int n,int r)
{
    int j;
    int count=0;
    bool trovato=false;
    j=0;
    while(j<N && !trovato)
    {
        if(a[r][j]==n)
        {
            count++;
            trovato=count>=k;
        }
    j++;
    }
return trovato;
}

bool occorrenze(int a[N][N],int k,int n)
{
    int contatore=0;
    bool cond=false;
    for(int i=0;i<N && cond;i++)
    {
        if(condizione(a,k,n,i))
        contatore++;
        if(contatore==k)
        cond=true;
    }
return cond;
}


Risposte
Ska1
Nel main $n$ chi è? Non gli viene dato valore ed inoltre c'è questo:
    for(int r=0;r<N;r++)
    {
        for(int j=0;j<N;j++)
        {
            a[r][j]=n;
        }
    }

Vai a riempire tutta la matrice con questo $n$....

Poi
    bool cond=false;
    for(int i=0;i<N && cond;i++)
    {
                ...
     }

nel for non ci entra mai dato che cond è falsa, inoltre devi verificare che il numero di righe in cui c'è l'occorrenza di riga sia in esattamente $k$ righe, non almeno $k$.

Infine, devi vedere se esiste un elemento $n$ della matrice che verifica questa condizione, quindi dovresti fare questo test per tutti gli elementi distinti della matrice (magari testando solo i valori che si ripetono almeno $k^2$ volte, dato che ci devo essere esattamente $k$ righe e almeno $k$ colonne di queste righe) e vedere se almeno uno di questi lo verifica.

giuliomontenero
n è un numero della matrice

Ska1
Sì, grazie.... te lo chiedevo nel tuo programma, dato che è una variabile dichiarata, senza un valore esplicito ed usata troppo alla leggera... Tu almeno uno di questi $n$ lo devi trovare per dire che la condizione è verificata!

giuliomontenero
come faccio a trovarlo nella matrice
cos' li ho inzializzati tutti a n e ho capito di aver sbagliato
come posso fare ora?

Ska1
"Ska":

Infine, devi vedere se esiste un elemento $n$ della matrice che verifica questa condizione, quindi dovresti fare questo test per tutti gli elementi distinti della matrice (magari testando solo i valori che si ripetono almeno $k^2$ volte, dato che ci devo essere esattamente $k$ righe e almeno $k$ colonne di queste righe) e vedere se almeno uno di questi lo verifica.


Prova a pensare a come realizzare in codice questo. Poi altro consiglio ti conviene mettere delle stampe per verificare che le tue funzioni facciano quello che vuoi, verificale provando un po' di valori e facendo stampare i risultati attesi, vedi subito se c'è qualcosa che non va.

giuliomontenero
non riesco a capire
puoi dirmi dove devo andare a modificare il codice?

Ska1
"Ska":
    bool cond=false;
    for(int i=0;i<N && cond;i++)
    {
                ...
     }


Inizia a sistemare questo, poi metti delle stampe a video di quello che sta succedendo nelle funzioni 'occorrenze' e 'condizione', tipo stampa per il valore $n$ corrente il numero di occorrenze per ogni riga, poi stampa se il numero di righe in cui l'occorrenza di riga è rispettata è esattamente pari al $k$ inserito. Tutto questo fallo assegnado tu un valore di $n$ nel main, ad esempio mettin $n=1$. Poi prova a vedere modificando la matrice di ingresso se effettivamente restituisce per quel valore di $n$ una sentenza corretta. Quando questo funziona allora puoi applicare questo in primissima analisi per ogni valore della matrice, poi potresti ottimizzare questo andando a fare il test solo su alcuni valori di $n$, anche se non è strettamente necessario.

giuliomontenero
ok ci provo e stasera ti faccio sapere

giuliomontenero
scusa ma l'esercizio dice che n è un numero all'interno della matrice
non devo metterlo io
come si fa a vedere se esiste n interno alla matrice
come l'ho scritto io ho solo inizializzato tutti gli elementi uguali a n ed è sbagliato lo so
come si può fare a cercare n?

Ska1
Per vedere se le funzioni che hai scritto funzionano, potresti inserirlo tu esplicitamente questo $n$, in questo modo vedi se il valore di $n$ inserito (che deve essere un elemento nella matrice) verifica la condizione per il $k$ specificato. Quando così funziona allora dato che tu questo $n$ non lo conosci a priori, lo cerchi, ovvero provi a testare ogni valore della matrice $a_{ij}$ quando uno di questi dice che la condizione è verificata allora hai verificato che in quella matrice esiste un elemento che la verifica (l'esistenza è implicata dal fatto che tu questo elemento lo trovi).

Alla fine avrai una cosa del tipo
bool esiste = false;
for (i = 0; i < N; i++) {
   for (j = 0; j < N; j++) {
     if (occorrenze(a, k, a[i][j])) {
          esiste = true;
          break;
     }
   }
   if (esiste) break;
}
if (esiste) cout << "Esiste" << endl;
else cout << "Non esiste" << endl;

giuliomontenero
perchè non mi funziona?
provo per n=1 e k=3
#include<iostream>
using namespace std;
const int N=7;
bool condizione(int [N][N],int ,int ,int );
bool occorrenze(int [N][N],int ,int );
int main()
{
    int a[N][N]={{6,2,3,1,1,5,9},{1,1,1,2,1,8,8},{4,3,1,9,7,6,1},{7,1,1,1,1,8,8},{3,4,5,6,2,1,8},{2,1,1,9,1,1,7},{9,5,4,1,2,2,3}};
    int n;
    int k;
    cout<<"inserisci un numero(interno alla matrice)"<<endl;
    cin>>n;
    cout<<endl;

    cout<<"Inserire un numero maggiore o uguake a 2 "<<endl;
    cin>>k;
    cout<<endl;

    if(!occorrenze(a,n,k))
    cout<<"NON ";

    cout<<" E' VERIFICATA LA CONDIZIONE"<<endl;

return 0;
}

bool condizione(int a[N][N],int n, int k,int row)
{
    row=0;
    int cont=0;
    bool trovato=false;
    for(int j=0;j<N && !trovato;j++)
    {
        if(a[row][j]==n)
        {
            cont++;
            trovato=cont>=k;
        }
    }
    return trovato;
}

bool occorrenze(int a[N][N],int n,int k)
{
    bool verifica=false;
    int contatore=0;
    for(int r=0;r<N && !verifica;r++)
    {
        if(condizione(a,n,k,r))
        contatore++;
    }
    if(contatore==k)
    verifica=true;

return verifica;
}


giuliomontenero
@Ska, potresti vedere perchè non funziona
io ho provato a rivedere il codice ma niente non capisco dove risieda l'errore
a me l'algoritmo pare giusto ci dovrà essere qualche imprecisione da qualche parte

giuliomontenero
ho risolto
grazie mille comunque

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.