Punto di sella

di il
3 risposte

Punto di sella

In una matrice A ad m righe ed n colonne, si definisce punto di sella un elemento aij tale che esso risulti essere contemporaneamente il massimo fra tutti elementi della riga i-esima e il minimo fra tutti gli elementi della colonna j-esima oppure risulti essere contemporaneamente il minimo fra tutti elementi della riga i-esima e il massimo fra tutti gli elementi della colonna j-esima.
Una matrice può avere zero, uno o più punti di sella. Scrivere un programma multifile che, letta da file di tipo testo una matrice di interi di dimensioni massime 50x50, il suo riempimento di riga r ed il suo riempimento di colonna c, stabilisca se esiste almeno un elemento che è punto di sella per la matrice inserita, e se esiste ne stampi le coordinate.

Il programma deve essere sviluppato prevedendo le seguenti funzioni:

- leggi_matrice : consente l’inserimento da tastiera della matrice e dei valori di riempimento;
- cerca_sella : ricerca il primo punto di sella (se esiste) e fornisce le sue coordinate, inoltre
restituisce il valore booleano ‘vero’ se un punto di sella è stato trovato, o restituisce
‘falso’ altrimenti
- minel: cerca il minimo elemento sulla riga o sulla colonna specificata
- max: cerca il massimo elemento sulla riga o sulla colonna specificata
Ho provato così ma senza successo.
void leggi_matrice(istream & in, int & n, Matrice &m)
{
	in >> n;
	for (int i=0; i<n; i++)
	for (int j=0; j<n; j++)
	{
		in >> m[i][j];
		
	}
}


void stampa_matrice(const Matrice m, const int n)
{
	for (int i=0; i<n; i++){
	for (int j=0; j<n; j++){
		cout << m[i][j] << ' ' ;
	}cout << endl;
}}

int min_el(const Vettore v, const int n)
{ 
int pos;
int min=v[0];
	for (int i=0; i<n; i++){
		if(v[i]<min) 
		{min=v[i];
		pos=i;}	
	}
	return pos;
}

int max_el(const Vettore v, const int n)
{ int pos;
int max=v[0];
	for (int i=0; i<n; i++){
		if(v[i]>max) 
		{max=v[i];
		pos=i;}	
		
	}
	return pos;
}

void sella(const Matrice m, const int n)
{	int posi, posj;
	bool found=false;
	for (int i=0; i<n&&!found; i++)
	for (int j=0; j<n&&!found; j++)
	if (max_el(m[i], n)==min_el(m[j], n)||min_el(m[i], n)==max_el(m[j], n))
	{
		posi=i;
		posj=j;
		found=true;
		
	}
	 if (found) cout << "il punto di sella e' stato trovato in posizione " << max_el(m[posi], n) << ' ' << min_el(m[posj], n) ;
	
}

3 Risposte

  • Re: Punto di sella

    Prima di tutto devi ritornare un bool nella funzione sella, poi credo che nelle funzioni min e max dovresti ritornare il valore, non la posizione, e nell'if di sella le condizioni sono sbagliate. Ammettendo che nel min e max ritorni il valore, allora dovresti fare
    
    if((m[i][j]==min_el(colonna)&&m[i][j]==min_el(riga))||(m[i][j]==max_el(colonna)&&m[i][j]==max_el(riga)))
    
  • Re: Punto di sella

    ANDPRI ha scritto:


    Prima di tutto devi ritornare un bool nella funzione sella, poi credo che nelle funzioni min e max dovresti ritornare il valore, non la posizione, e nell'if di sella le condizioni sono sbagliate. Ammettendo che nel min e max ritorni il valore, allora dovresti fare
    
    if((m[i][j]==min_el(colonna)&&m[i][j]==min_el(riga))||(m[i][j]==max_el(colonna)&&m[i][j]==max_el(riga)))
    
    Grazie per la risposta! In realtà avevo già provato a fare in questo modo ma non funzionava, ma può anche darsi che abbia sbagliato qualcosa!
    Comunque penso di aver risolto, cioè ho provato un po' ma questo dovrebbe funzionare, anche se è solo un caso: minimo della riga i-esima, massimo della colonna j-esima.
    Per l'inverso dovrebbe essere più o meno lo stesso, ma... non c'ho voglia di farlo
    bool sella(const Matrice m, const int n, int & posi, int & posj)
    {	int i, j, col;
    	bool found=false;
    	bool esci=false;
    	i=0;
    	while(i<n && !found)
    	{
    		col=min_el(m[i], n);
    		j=0;
    		esci=false;
    		while(!found && j<n && !esci)
    		{
    			if (m[j][col]>m[i][col])
    			esci=true;
    			else{
    			j++;
    			}
    		}
    		if (esci==false) 
    		{posi=i;
    		posj=col;
    		found=true;}
    		else{
    		
    		i++;}
    	}
  • Re: Punto di sella

    Ti basterebbe modificare le due funzioni min e max in modo che ritornino il valore e non la posizione, e poi mettere quelle condizioni nell'if e dovrebbe funzionare...
Devi accedere o registrarti per scrivere nel forum
3 risposte