Es. 1 Siano dati in ingresso due matrici di numeri interi M1 e M2.
Si assuma che il numero di colonne di M1 sia uguale al numero
di righe di M2. Scrivere un programma che, per ogni riga di M1,individui la
colonna C di M2 avente il più elevato numero di elementi in comune
con tale riga. Si provveda quindi a scambiare gli elementi della
riga R con quelli della colonna C. Stampare infine le matrici M1 e M2 cosi ottenute.
#include <iostream>
#include<cstdlib>
#define nmax 100
using namespace std;
void leggi_vettore(int dim,int V[])
{
for(int i=0;i<dim;i++)
{
cout<<"\nInserisci l'elemento "<<i+1<<" ";
cin>>V[i];
}
}
void stampa_vettore(int dim,int V[])
{
for(int i=0;i<dim;i++)
{
cout<<" "<<V[i];
}
}
void leggi_matrice(int nrig,int ncol,int M[][nmax])
{
for(int i=0;i<nrig;i++)
{
cout<<"\n";
for(int j=0;j<ncol;j++)
{
cout<<"Inserisci l'elemento posto alla riga "<<i+1<<" e alla colonna "<<j+1<<"\n";
cin>>M[i][j];
}
}
}
void stampa_matrice(int nrig,int ncol,int M[][nmax])
{
for(int i=0;i<nrig;i++)
{
cout<<"\n";
for(int j=0;j<ncol;j++)
{
cout<<" "<<M[i][j]<<" ";
}
}
}
int pos_max(int dim,int V[])
{
int max=V[0];
int posmax=0;
for(int i=1;i<dim;i++)
{
if(V[i]>max)
{
max=V[i];
posmax=i;
}
}
return posmax+1;
}
int nmax_comune(int dim1,int V1[],int dim2,int V2[])
{
int cont=0;
int j;
for(int i=0;i<dim2;i++)
{
j=0;
if(V2[i]==V1[j])
cont++;
else
{
while(V2[i]!=V1[j]&&j<=dim1-1)
{
++j;
if(V2[i]==V1[j])
{
++cont;
break;
}
}
}
}
return cont;
}
int main()
{
cout<<"Numero colonne M1 e righe M2 ";
int dim;
cin>>dim;
cout<<"\nNumero righe M1 ";
int nrig1;
cin>>nrig1;
cout<<"\nNumero colonne M2 ";
int ncol2;
cin>>ncol2;
int M1[nmax][nmax];
int M2[nmax][nmax];
cout<<"\nInserimento della prima matrice...\n";
leggi_matrice(nrig1,dim,M1);
cout<<"\nM1 = ";
stampa_matrice(nrig1,dim,M1);
cout<<"\nInserimento della seconda matrice...\n";
leggi_matrice(dim,ncol2,M2);
cout<<"\nM2 = ";
stampa_matrice(dim,ncol2,M2);
//creo 2 vettori di supporto V1 e V2 in cui memorizzare rispettivamente una riga di M1 e una colonna di M2
int V1[nmax];
int V2[nmax];
int V3[nmax]; //creo un terzo vettore V3 nelle cui componenti memorizzo il max numero di elementi in comune tra la riga e la colonna. La posizione del max mi darà la colonna da scambiare.
for(int j=0;j<nrig1;j++)
{
for(int i=0;i<dim;i++) //copio in V1 la j-esima riga di M1
{
V1[i]=M1[j][i];
}
for(int k=0;k<ncol2;k++)
{
for(int i=0;i<dim;i++) //copio in V2 la k-esima colonna di M2
{
V2[i]=M2[i][k];
}
//copio nella k-esima componente di V3 il massimo numero di elementi in comune tra la riga j di M1 e la colonna k di M2
V3[k]=nmax_comune(dim,V1,dim,V2);
}
//scambio
for(int i=0;i<dim;i++)
{
M1[j][i]=M2[i][pos_max(ncol2,V3)-1];
M2[i][pos_max(ncol2,V3)-1]=V1[i];
}
}
cout<<"\nM1 = ";
stampa_matrice(nrig1,dim,M1);
cout<<"\nM2 = ";
stampa_matrice(dim,ncol2,M2);
}