Sunteți pe pagina 1din 6

2.

INTRODUCERE PARTITIILE UNUI NUMAR NATURAL 3. SARITURA CALULUI 4. REGINELE 5. PROBLEME PROPUSE
1.

Backtracking este numele unui algoritm general de descoperire a tuturor soluiilor unei probleme de calcul, algoritm ce se bazeaz pe construirea incremental de soluii-candidat, abandonnd fiecare candidat parial imediat ce devine clar c acesta nu are anse s devin o soluie valid. Backtrackingul este util la rezolvarea unor probleme de satisfacere a constrngerilor, cum ar fi cuvintele ncruciate, jocuri de sudoku i alte probleme similare.

Partiiile unui numr natural. Fie n>0, natural. S se scrie un program care s afieze toate partiiile unui numr natural n. Numim partiie a unui numr natural nenul n o mulime de numere naturale nenule {p1, p2, , pk} care ndeplinesc condiia p1+p2+ +pk = n.

#include<iostream.h> int n, ns,sol[20]; void afis(int l) { int i; ns++; cout<<"Solutia nr. "<< ns<<" : "; for(i=1;i<=l;i++) cout<<sol[i]<<" "; cout<<endl; } void back(int i, int sp) { int j; if (sp==n) afis(i-1); else for(j=1;j<=n-sp;j++) if (j>=sol[i-1]) {

sol[i]=j; back(i+1, sp+j); } } void main() { cin>>n; ns=0; back(1,0); cout<<ns<<" solutii"; }

Fiind dat o tabl de ah de dimensiunea nxn i un cal n colul stnga sus al acesteia, se cere s se afieze toate posibilitile de mutare a acestei piese de ah astfel nct s treac o singur dat prin fiecare ptrat al tablei. O soluie va fi afiat ca o matrice nxn n care sunt numerotate sriturile calului. #include<fstream.h> const int dx[8]={-1,1,2,2,1,-1,-2,-2}; const int dy[8]={-2,-2,-1,1,2,2,1,-1}; int a[10][10],n; ofstream f("cal.out"); void afis() { int i,j; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) f<<a[i][j]<<" "; f<<endl; } f<<endl; } int inside(int i,int j) { return i>=1 && i<=n && j>=1 && j<=n; } void back(int i, int j, int pas) { int k,inou,jnou; a[i][j]=pas; if (pas==n*n) afis(); else for(k=0;k<8;k++) { inou=i+dx[k]; jnou=j+dy[k]; if (inside(inou,jnou) && a[inou][jnou]==0) back(inou,jnou,pas+1); } a[i][j]=0; } void main() { cin>>n;; back(1,1,1); }

Considerandu-se o tabla de sah de dimansiune NXN, sa se determine toate modalitatile de amplasare a n regine pe tabla de sah astfel incat sa nu se atace doua cate doua(doua regine se ataca daca se afla pe aceeasi linie, coloana, sau diagonala).
#include<iostream.h> #include<math.h> #include<conio.h> int x[50],k,valid,n,m,nr; void citire() { cout<<"n=";cin>>n; } void posibil(int k,int &valid) { valid=1; for(int i=1;i<=k-1;i++) if(abs(x[i]-x[k])==abs(i-k)||(x[i]==x[k])) valid=0; /*doua dame nu se pot afla pe aceiasi linie (k), aceiasi coloana (x[k]) sau aceiasi diagonala*/ } int solutie(int k) { if(k==n)return 1; else return 0; } void afisare(int k) { nr++; cout<<"solutia "<<nr<<endl; for(int i=1;i<=k;i++){ for (int j=1;j<=k;j++) if (x[i]==j) cout<<"D"<<" "; else cout<<"*"<<" "; cout<<endl; }} void back() { k=1; x[k]=0; while(k>0) { valid=0; while(!valid && x[k]<n) { x[k]=x[k]+1; posibil(k,valid); } if(!valid)k--; else if(solutie(k)) afisare(k); else { k++; x[k]=0; } } } void main() { citire(); nr=0; back(); getch(); }

1. Se d o hart cu n orae. Pe aceast sunt trasate m drumuri, care unesc oraele dou cte dou. S se determine calea care leag dou orae oarecare. 2. S se determine toate mutrile pe care trebuie s le efectueze un cal pe o tabl de ah astfel nct s treac prin toate poziiile cel puin o dat, pornind dintr-o poziie oarecare. 3. Un copil intra intr-un magazin de jucarii. El are o suma s de bani si doreste sa-si cumpere cat mai multe jucarii. Sa se cate produse diferite poate cumpara copilul stiind ca in magazin se afla n produse, fiecare avand cate un pret dat.

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