Advertisement
dude2099

Partitii backtracking

Nov 22nd, 2019
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.15 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. int sol, n, x[100],maxim;
  5. void init(int k)
  6. {
  7.     x[k]=0;
  8. }
  9. int existaSuccesor(int k)
  10. {
  11.     maxim=0;
  12.     for(int i=0;i<k;i++)
  13.         if(x[i]>maxim)
  14.             maxim=x[i];
  15.     return x[k]<=maxim;
  16. }
  17. int cont(int k)
  18. {
  19.     return 1;
  20. }
  21. int solutie(int k)
  22. {
  23.     return k==n;
  24. }
  25. void tipar()
  26. {
  27.     sol++;
  28.     cout<<"\nPartitia "<<sol<<":"<<endl;
  29.     if(maxim<x[n]) maxim=x[n];
  30.     for(int m=1; m<=maxim; m++)
  31.     {
  32.         cout<<"Submultimea "<<m<<": ";
  33.         for(int i=1;i<=n;i++)
  34.             if(x[i]==m)
  35.                 cout<<i<<" ";
  36.         cout<<endl;
  37.     }
  38.     cout<<endl;
  39. }
  40. void back()
  41. {
  42.     int k=1;
  43.     init(1);
  44.     while(k>0)
  45.     {
  46.         if(existaSuccesor(k))
  47.         {
  48.             x[k]++;
  49.             if(cont(k))
  50.                 if(solutie(k))
  51.                    tipar();
  52.                 else
  53.                 {
  54.                     k++;
  55.                     init(k);
  56.                 }
  57.         }
  58.         else
  59.             k--;
  60.     }
  61. }
  62. int main()
  63. {
  64.     cout<<"cate persoane sunt? "; cin>>n;
  65.     cout<<"Submultimile de bisericute sunt: "<<endl;
  66.     back();
  67.     return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement