Sunteți pe pagina 1din 5

Divide et impera

1. sa determinan suma elementelor unui vector de intregi utilizand metoda Divide et Impera:
int divide(int li,int ls) // functia primeste ca parametric extremitatile unei secvente din vector
{int mij, d1 ,d2; //mijlocul, d1 si d2 retin sumele pe extr. Stanga respective dreapta
if(li!=ls) //algoritmul se autoapeleaza daca secventele au lungime mai mare de 1
{mij=(li+ls)/2;
d1=divide(li,mij);
d2=divide(mij+1,ls);
return d1+d2;
}
else
return v[li];
}
void main()
{clrscr();
cout<<“n=”;
cin>>n;
for(int i=1;i<=n;i++)
{cout<<“v[“<<i<<“]=”;
cin>>v[i];}
cout<<“suma celor “<<n<<” elemente ale vectorului “<<divide(1,n);
return 0;
}
2. Aflarea maximului elementelor ale unui vector( Cu metoda Divide et Impera):
#include <iostream>
using namespace std;
int n,v[20],z;
void divide(int s,int d,int &m)
{
m=(s+d)/2;
}
void combina (int x1,int x2,int &z)
{
if(x1<x2) z=x2; else z=x1;
}
void dei(int s,int d,int &z)
{
int m,x1,x2;
if(s==d)
z= v[s];
else
{
divide(s,d,m);
dei(s,m,x1);
dei(m+1,d,x2);
if(x1<x2) z=x2; else z=x1;
}
}
int main ()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>v[i];
dei(1,n,z);
cout<<”maximul=”<<z;
return 0;
}
3. Aflarea sumei elementelor ale unui vector( Cu metoda Divide et Impera):
#include <iostream>
using namespace std;
int n,v[20],z;
void divide(int s,int d,int &m)
{
m=(s+d)/2;
}
void combina (int x1,int x2,int &z)
{
z=x1+x2;
}
void dei(int s,int d,int &z)
{
int m,x1,x2;
if(s==d)
if(v[s]<0) z=v[s];
else z=0;
else
{
divide(s,d,m);
dei(s,m,x1);
dei(m+1,d,x2);
combina(x1,x2,z);
}
}
int main ()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>v[i];
dei(1,n,z);
cout<<”suma=”<<z;
return 0;
}
// muta n discuri de pe tija S pe tija D folosind tija aux
Hanoi(n, S, D, aux) {
if (n >= 1) {
Hanoi(n - 1, S, aux, D); // mut n-1 discuri de pe sursa
(S) pe auxiliar (aux)
// in aceasta subproblema sursa
este S, destinatia este aux, intermediarul este D

Muta_disc(S, D); // acum pot muta direct discul n


de pe sursa (S) pe destinatie (D)

Hanoi(n - 1, aux, D, S); // mut n-1 discuri de pe sursa


(aux, aici sunt ele momentan) pe destinatie (D - scop final)
// in aceasta subproblema, S este
auxiliar, intrucat este tija libera
}
}

3. Sa se determine elementul minim din vector


#include<iostream>
intn,v[20],i,z,k;
using namespace std;
void divide(ints,intd,int &m)
{
m=(s+d)/2;
}
void combinamin(int x1,int x2,int &z)
{
if(x1<x2)
z=x1;
else
z=x2;
}
void deimin(ints,intd,int &z)
{
int x1,x2;
int m;
if(s==d)
z=v[s];
else
{
divide(s,d,m);
deimin(s,m,x1);
deimin(m+1,d,x2);
combinamin(x1,x2,z);
}
}
int main()
{
cin>>n;
for(i=1;i<=n;i++)
cin>>v[i];
deimin(1,n,z);
cout<<”minimul=”<<z;}

Folosind metoda divide et impera, scrieti o functie care sa determine daca


un tablou cu elemente intregi este ordonat crescator.
int ordon(int v[], int s, int d)
{
if(s==d) return 1;
else
if(ordon(v,s,(s+d)/2) && ordon(v,(s+d)/2+1,d) &&
v[(s+d)/2]<=v[(s+d)/2+1]) return 1;
else return 0;
}

Scrieti o functie minmax care sa determine elementul minim si elementul


maxim dintr-un tablou cu elemente intregi folosind metoda divide et
impera.

void minmax(int v[], int s, int d, int &minn, int &maxx)


{
if(s==d) minn=maxx=v[s];
else
{
int a,b,x,y;
minmax(v,s,(s+d)/2,a,x);
minmax(v,(s+d)/2+1,d,b,y);
if(a<b) minn=a;
else minn=b;
if(x>y) maxx=x;
else maxx=y;
}
}

Se citeste un vector cu n elemente numere naturale. Sa se calculeze CMMDC


al elementelor vectorului folosind divide et impera.
#include<iostream>

using namespace std;

int cmmdc(int a[100], int s, int d)


{ if(s==d) return a[s];
else
{ int x,y;
x=cmmdc(a,s,(s+d)/2);
y=cmmdc(a,(s+d)/2+1,d);
while(x!=y)
if(x>y) x=x-y;
else y=y-x;
return x;
}
}

int main()
{
int a[100],n,i;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
cout<<cmmdc(a,1,n);
system("pause");
return 0;
}
Turnurile din Hanoi.

#include<fstream>
using namespace std;
ifstream fin("h.in");
ofstream fout("h.out");

void hanoi(int n, char a, char b, char c,char t1[10], char t2[10], char
t3[10])
{
if(n>=1)
{

hanoi(n-1,a,c,b,t1,t3,t2);
int x=strlen(t2);
t2[x]=t1[strlen(t1)-1];
t2[x+1]=0;
strcpy(t1+strlen(t1)-1, t1+strlen(t1));
fout<<t1<<endl<<t2<<endl<<t3<<endl;
fout<<a<<"->"<<b<<endl<<endl;
hanoi(n-1,c,b,a,t3,t2,t1);
}
}
int main()
{
char t1[10]="A", t2[10]="B", t3[10]="C";
int n;
fin>>n;
for(int i=n;i>=1;i--) t1[n-i+1]=i+'0';
t1[n+1]=0;
hanoi(n,'A','B','C',t1,t2,t3);
fin.close();
fout.close();
}
Se citeste un vveeccttoorr cu n elemente numere naturale. Sa se calculeze suma
elementelor vectorului folosind divide et impera.

#include<iostream>

using namespace std;

int suma(int a[100], int s, int d)


{ if(s==d) return a[s];
else return suma(a,s,(s+d)/2)+suma(a,(s+d)/2+1,d);
}

int main()
{
int a[100],n,i;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
cout<<suma(a,1,n);
system("pause");
return 0;
}
Se citeste un vector cu n elemente numere naturale. Sa se determine
elementul minim din vector folosind divide et impera.
#include<iostream>

using namespace std;

int min(int a[100],int s , int d)


{
if ( s == d ) return a[s];
else
{
int m = (s+d)/2;
int m1 = min(a,s,m);
int m2 = min(a,m+1,d);

if ( m1 < m2 ) return m1;


else return m2;

}
}

int main()
{
int a[100];
int n ;
cin>> n;
for (int i = 0 ; i < n ;i++)
cin>>a[i];

cout << min(a,1,n);

system("pause");
return 0;
}

S-ar putea să vă placă și