Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. using namespace std;
  5.  
  6. int x[51];
  7. int k, n, nsol;
  8. bool buna;
  9.  
  10. bool ConditiiContinuare(int k)
  11. {
  12.      // aici testam ca regina k sa nu se atace
  13.      // pe linie sau pe diagonala cu vreuna
  14.      // din reginele dinaintea sa
  15.      bool atac=false;
  16.      int i=1;
  17.      while (!atac && i<k)
  18.            if (x[i]==x[k] || k-i==abs(x[k]-x[i]))
  19.     //doar prima conditie pentru ture si doar a doua conditie pentru nebuni
  20.               atac=true;
  21.            else i++;
  22.      return !atac;
  23. }
  24.  
  25. void ScrieSolutia()
  26. {
  27.      nsol++;
  28.      cout<<"Solutie "<<nsol<<" este:\n";
  29.      for (int i=1; i<=n; i++)
  30.      {
  31.          cout<<"  Asezati regina nr. "<<i<<" pe linia " <<i<<" si coloana "<<x[i]<<"\n";
  32.          //cout<<x[i]; //pentru generarea permutarilor
  33.      }
  34.      //system("pause");
  35.      getch();
  36. }
  37.  
  38. int main()
  39. {
  40.     cout<<"Problema reginelor\n";
  41.     cout<<"Dati numarul n: ";
  42.     cin>>n;
  43.     k=1; // plecam cu prima regina
  44.     x[k]=0; // asezam regina aceasta sub tabla
  45.     nsol=0; // numarul de solutii
  46.     while (k>0) // cat timp inca mai avem regine pe tabla
  47.       {
  48.           buna=false; // deocamdata regina nu sta bine acolo
  49.           // cat timp pozitia curenta nu e buna si regina
  50.           // mai poate fi dusa cu o linie mai sus
  51.           while (!buna && x[k]<n)
  52.                 {
  53.                   // mut regina mai sus cu un rand/o linie
  54.                   x[k]++;
  55.                   // testez conditiile de continuare k->k+1
  56.                   if (ConditiiContinuare(k)) buna=true;
  57.  
  58.                 }
  59.           if (buna) // daca varianta pentru regina k este buna...
  60.              if (k==n) // daca am ajuns la ultima regina...
  61.                  ScrieSolutia(); // atunci afisam solutia
  62.              else // daca nu am ajuns la ultima,
  63.                   {
  64.                     k++; // trecem la urmatoarea regina
  65.                     x[k]=0; // si o asezam sub tabla
  66.                   }
  67.           else
  68.               k--; // daca nu (mai) gasim o varianta buna
  69.               // atunci ne intoarcem la regina anterioara
  70.       }
  71.  
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement