Aranjamente

Se dau două mulţimi A={1,2,…,p} şi B={1,2,…,m} se cer toate funcţiile injective definite pe A cu valori în B. O astfel de problemă este una de generare a aranjamentelor de n luate cate p (Anp).

Exemplu: p=2, n=3. Avem (1,2), (2,1), (1,3), (3,1), (2,3), (3,2). De exemplu (2,1) este funcţia f:A→B dată astfel f(1)=2, f(2)=1. 
Se citesc m şi p. Să se genereze toate aranjamentele de m luate câte p.
Se observă că dacă se cunoaşte fiecare submulţime de p elemente a mulţimii de m elemente, atunci aranjamentele se pot obţine permutând în toate modurile posibile elementele unei astfel de mulţimi.
O soluţie este de forma: x1,x2,...xp  unde x1,x2,...xpÎB. În plus x1,x2,...xp trebuie să fie distincte. O soluţie are p numere din mulţimea B şi numerele trebuie să fie distincte.
De aici rezultă că algoritmul este acelaşi ca la permutări, diferenţa fiind dată de faptul că soluţia are p numere, nu m ca în cazul permutărilor. 
Exemplu:
#include<iostream.h>
#include<stdio.h>
typedef int sir[100];
sir x;
int i,k,m,p;
int as,ev;

sir a;
void succ(sir x, int k, int &as)
{
if(x[k]<m)
  {
  as=1;
  x[k]=x[k]+1;
  }
else as=0;
}
void valid(sir x, int k, int &as)
{
int i;
ev =1;
for(i=1;i<=k-1;i++)
  if(x[k]==x[i])    ev=0;
}
void afis(sir x, int k)
{
int i;
for(i=1;i<=k;i++)
  cout<<a[x[i]]<<" ";  cout<<endl; 
}
int main(void)
{
cout<<"m=";
cin>>m;
for(i=1;i<=m;i++)
  cin>>a[i];
cout<<"p=";
cin>>p;
k=1;
x[k]=0;
while(k>0)
  {
  do
    {
  succ(x,k,as);
  if(as) valid(x,k,ev);
  }
  while(as&&!ev);
  if(as)
  if(k==p) afis(x,k);  else
  {
  k=k+1;
  x[k]=0;
  }
  else k=k-1;
  }
}

Niciun comentariu:

Trimiteți un comentariu

Template developed by Confluent Forms LLC; more resources at BlogXpertise