Skriver ut alle løsninger i N-Queen Problem

Skriver ut alle løsninger i N-Queen Problem
Prøv det på GfG Practice N-dronning

Gitt et heltall n oppgaven er å finne alle distinkte løsninger til n-dronninger problem hvor n dronninger er plassert på en n * n sjakkbrett slik at ingen to dronninger kan angripe hverandre.

Note: Hver løsning er en unik konfigurasjon av n dronninger representert som en permutasjon av [123...n] . Nummeret på jeg th posisjon indikerer raden til dronningen i jeg th søyle. For eksempel [3142] viser en slik layout.

Eksempel:

Inndata: n = 4
Produksjon: [2 4 1 3] [3 1 4 2]


Forklaring: Dette er de 2 mulige løsningene.

Inndata: n = 2
Produksjon: []
Forklaring: Ingen løsning da dronninger kan angripe hverandre i alle mulige konfigurasjoner.

Innholdsfortegnelse

[Naiv tilnærming] - Bruke rekursjon - O(n! * n) Tid og O(n) Mellomrom

En enkel idé å løse N-Queens problem er å generere alle mulige permutasjoner av [1 2 3 ... n] og sjekk deretter om den representerer en gyldig N-Queens-konfigurasjon. Siden hver dronning må være i en annen rad og kolonne ved å bruke permutasjoner automatisk tar seg av disse reglene. Men vi må fortsatt sjekke at det ikke er to dronninger på samme diagonal.

Nedenfor er gitt implementering:

C++
   //C++ program to find all solution of N queen problem    //using recursion   #include          #include      #include       using     namespace     std  ;   // Function to check if the current placement is safe   bool     isSafe  (  vector   <  int  >&     board       int     currRow        int     currCol  )     {      // Check all previously placed queens      for  (  int     i     =     0  ;     i      <     board  .  size  ();     ++  i  )     {      int     placedRow     =     board  [  i  ];      // Columns are 1-based      int     placedCol     =     i     +     1  ;      // Check if the queen is on the same diagonal      if  (  abs  (  placedRow     -     currRow  )     ==     abs  (  placedCol     -     currCol  ))     {      return     false  ;     // Not safe      }      }      // Safe to place the queen      return     true  ;      }   // Recursive function to generate all possible permutations   void     nQueenUtil  (  int     col       int     n       vector   <  int  >&     board           vector   <  vector   <  int  >>&     res       vector   <  bool  >&     visited  )     {      // If all queens are placed add into res      if  (  col     >     n  )     {      res  .  push_back  (  board  );      return  ;      }      // Try placing a queen in each row      // of the current column      for  (  int     row     =     1  ;     row      <=     n  ;     ++  row  )     {      // Check if the row is already used      if  (  !  visited  [  row  ])     {          // Check if it's safe to place the queen      if  (  isSafe  (  board       row       col  ))     {      // Mark the row as used      visited  [  row  ]     =     true  ;         // Place the queen      board  .  push_back  (  row  );         // Recur to place the next queen      nQueenUtil  (  col     +     1       n       board        res       visited  );      // Backtrack: remove the queen      board  .  pop_back  ();             // Unmark row      visited  [  row  ]     =     false  ;         }      }      }   }   // Main function to find all distinct    // res to the n-queens puzzle   vector   <  vector   <  int  >>     nQueen  (  int     n  )     {      vector   <  vector   <  int  >>     res  ;         // Current board configuration      vector   <  int  >     board  ;         // Track used rows      vector   <  bool  >     visited  (  n     +     1       false  );         // Start solving from the first column      nQueenUtil  (  1       n       board       res       visited  );      return     res  ;      }   int     main  ()     {      int     n     =     4  ;         vector   <  vector   <  int  >>     res     =     nQueen  (  n  );         for  (  int     i     =     0  ;  i      <     res  .  size  ();     i  ++  )     {      cout      < <     '['  ;      for  (  int     j     =     0  ;     j      <     n  ;     ++  j  )     {      cout      < <     res  [  i  ][  j  ];         if  (  j     !=     n     -     1  )     cout      < <     ' '  ;         }      cout      < <     ']  n  '  ;      }      return     0  ;   }   
Java
   //Java program to find all solution of N queen problem    //using recursion   import     java.util.ArrayList  ;   class   GfG     {      // Check if placement is safe      static     boolean     isSafe  (  ArrayList   <  Integer  >     board           int     currRow       int     currCol  )     {          for  (  int     i     =     0  ;     i      <     board  .  size  ();     i  ++  )     {      int     placedRow     =     board  .  get  (  i  );      int     placedCol     =     i     +     1  ;      // Check diagonals      if  (  Math  .  abs  (  placedRow     -     currRow  )     ==         Math  .  abs  (  placedCol     -     currCol  ))     {      return     false  ;     // Not safe      }      }      return     true  ;     // Safe to place      }      // Recursive utility to solve      static     void     nQueenUtil  (  int     col       int     n           ArrayList   <  Integer  >     board           ArrayList   <  ArrayList   <  Integer  >>     res           boolean  []     visited  )     {      // If all queens placed add to res      if  (  col     >     n  )     {      res  .  add  (  new     ArrayList   <>  (  board  ));      return  ;      }      // Try each row in column      for  (  int     row     =     1  ;     row      <=     n  ;     row  ++  )     {      // If row not used      if  (  !  visited  [  row  ]  )     {      // Check safety      if  (  isSafe  (  board       row       col  ))     {      // Mark row      visited  [  row  ]     =     true  ;      // Place queen      board  .  add  (  row  );      // Recur for next column      nQueenUtil  (  col     +     1       n       board           res       visited  );      // Backtrack      board  .  remove  (  board  .  size  ()  -  1  );      visited  [  row  ]     =     false  ;      }      }      }      }      // Function to solve N-Queen      static     ArrayList   <  ArrayList   <  Integer  >>     nQueen  (  int     n  )     {      ArrayList   <  ArrayList   <  Integer  >>     res     =     new     ArrayList   <>  ();      ArrayList   <  Integer  >     board     =     new     ArrayList   <>  ();      boolean  []     visited     =     new     boolean  [  n     +  1  ]  ;      nQueenUtil  (  1       n       board       res       visited  );      return     res  ;      }      public     static     void     main  (  String  []     args  )     {      int     n     =     4  ;      ArrayList   <  ArrayList   <  Integer  >>     res     =     nQueen  (  n  );          for  (  ArrayList   <  Integer  >     row     :     res  )     {      System  .  out  .  print  (  '['  );      for  (  int     i     =     0  ;     i      <     row  .  size  ();     i  ++  )     {          System  .  out  .  print  (  row  .  get  (  i  ));      if  (  i     !=     row  .  size  ()  -  1  )      System  .  out  .  print  (  ' '  );      }      System  .  out  .  println  (  ']'  );      }      }   }   
Python
   #Python program to find all solution of N queen problem    #using recursion   # Function to check if placement is safe   def   isSafe  (  board     currRow     currCol  ):   for   i   in   range  (  len  (  board  )):   placedRow   =   board  [  i  ]   placedCol   =   i   +   1   # Check diagonals   if   abs  (  placedRow   -   currRow  )   ==    abs  (  placedCol   -   currCol  ):   return   False   # Not safe   return   True   # Safe to place   # Recursive utility to solve N-Queens   def   nQueenUtil  (  col     n     board     res     visited  ):   # If all queens placed add to res   if   col   >   n  :   res  .  append  (  board  .  copy  ())   return   # Try each row in column   for   row   in   range  (  1     n  +  1  ):   # If row not used   if   not   visited  [  row  ]:   # Check safety   if   isSafe  (  board     row     col  ):   # Mark row   visited  [  row  ]   =   True   # Place queen   board  .  append  (  row  )   # Recur for next column   nQueenUtil  (  col  +  1     n     board     res     visited  )   # Backtrack   board  .  pop  ()   visited  [  row  ]   =   False   # Main N-Queen solver   def   nQueen  (  n  ):   res   =   []   board   =   []   visited   =   [  False  ]   *   (  n   +   1  )   nQueenUtil  (  1     n     board     res     visited  )   return   res   if   __name__   ==   '__main__'  :   n   =   4   res   =   nQueen  (  n  )   for   row   in   res  :   print  (  row  )   
C#
   //C# program to find all solution of N queen problem    //using recursion   using     System  ;   using     System.Collections.Generic  ;   class     GfG     {      // Check if placement is safe      static     bool     isSafe  (  List   <  int  >     board       int     currRow        int     currCol  ){      for     (  int     i     =     0  ;     i      <     board  .  Count  ;     i  ++  )     {      int     placedRow     =     board  [  i  ];      int     placedCol     =     i     +     1  ;      // Check diagonals      if     (  Math  .  Abs  (  placedRow     -     currRow  )      ==     Math  .  Abs  (  placedCol     -     currCol  ))     {      return     false  ;     // Not safe      }      }      return     true  ;     // Safe to place      }      // Recursive utility to solve      static     void     nQueenUtil  (  int     col       int     n       List   <  int  >     board        List   <  List   <  int  >     >     res        bool  []     visited  ){      // If all queens placed add to res      if     (  col     >     n  )     {      res  .  Add  (  new     List   <  int  >  (  board  ));      return  ;      }      // Try each row in column      for     (  int     row     =     1  ;     row      <=     n  ;     row  ++  )     {      // If row not used      if     (  !  visited  [  row  ])     {      // Check safety      if     (  isSafe  (  board       row       col  ))     {      // Mark row      visited  [  row  ]     =     true  ;      // Place queen      board  .  Add  (  row  );      // Recur for next column      nQueenUtil  (  col     +     1       n       board       res        visited  );      // Backtrack      board  .  RemoveAt  (  board  .  Count     -     1  );      visited  [  row  ]     =     false  ;      }      }      }      }      // Main N-Queen solver      static     List   <  List   <  int  >>     nQueen  (  int     n  ){      List   <  List   <  int  >     >     res     =     new     List   <  List   <  int  >     >  ();      List   <  int  >     board     =     new     List   <  int  >  ();      bool  []     visited     =     new     bool  [  n     +     1  ];      nQueenUtil  (  1       n       board       res       visited  );      return     res  ;      }      static     void     Main  (  string  []     args  )     {      int     n     =     4  ;      List   <  List   <  int  >>     res     =     nQueen  (  n  );      foreach     (  var     temp     in     res  )     {      Console  .  WriteLine  (  '['     +     String  .  Join  (  ' '       temp  )     +     ']'  );      }      }   }   
JavaScript
   //JavaScript program to find all solution of N queen problem    //using recursion   // Function to check if placement is safe   function     isSafe  (  board       currRow       currCol  ){      for     (  let     i     =     0  ;     i      <     board  .  length  ;     i  ++  )     {      let     placedRow     =     board  [  i  ];      let     placedCol     =     i     +     1  ;          // Check diagonals      if     (  Math  .  abs  (  placedRow     -     currRow  )     ===         Math  .  abs  (  placedCol     -     currCol  ))     {      return     false  ;     // Not safe      }      }      return     true  ;     // Safe to place   }   // Recursive utility to solve N-Queens   function     nQueenUtil  (  col       n       board       res       visited  ){      // If all queens placed add to res      if     (  col     >     n  )     {      res  .  push  ([...  board     ]);      return  ;      }          // Try each row in column      for     (  let     row     =     1  ;     row      <=     n  ;     row  ++  )     {          // If row not used      if     (  !  visited  [  row  ])     {          // Check safety      if     (  isSafe  (  board       row       col  ))     {          // Mark row      visited  [  row  ]     =     true  ;          // Place queen      board  .  push  (  row  );          // Recur for next column      nQueenUtil  (  col     +     1       n       board       res        visited  );          // Backtrack      board  .  pop  ();      visited  [  row  ]     =     false  ;      }      }      }   }   // Main N-Queen solver   function     nQueen  (  n  ){      let     res     =     [];      let     board     =     [];      let     visited     =     Array  (  n     +     1  ).  fill  (  false  );      nQueenUtil  (  1       n       board       res       visited  );      return     res  ;   }   // Driver code   let     n     =     4  ;   let     res     =     nQueen  (  n  );   res  .  forEach  (  row     =>     console  .  log  (  row  ));   

Produksjon
[2 4 1 3] [3 1 4 2]  

Tidskompleksitet: O(n!*n) n! for å generere alt permutasjoner og O(n) for validering av hver permutasjon.
Hjelpeplass: På)

[Forventet tilnærming] - Bruk av tilbakesporing med beskjæring - O(n!) Tid og O(n) Space

For å optimalisere tilnærmingen ovenfor kan vi bruke tilbakesporing med beskjæring . I stedet for å generere alle mulige permutasjoner bygger vi løsningen trinnvis mens vi gjør dette, kan vi forsikre oss om at delløsningen forblir gyldig ved hvert trinn. Hvis det oppstår en konflikt, vil vi gå tilbake umiddelbart, dette hjelper unngå unødvendig beregninger .

Trinn-for-steg implementering :

  • Start fra den første kolonnen og prøv å plassere en dame i hver rad.
  • Hold matriser for å spore hvilke rader er allerede opptatt. Tilsvarende for sporing major og mindre diagonaler er allerede opptatt.
  • Hvis en dronning plassering konflikter med eksisterende dronninger hoppe over at rad og tilbakespor dronningen for å prøve det neste mulig rad (Beskjære og gå tilbake under konflikt).
C++
   // C++ program to find all solution of N queen problem by   // using backtracking and pruning   #include          #include          #include         using     namespace     std  ;   // Utility function for solving the N-Queens   // problem using backtracking.   void     nQueenUtil  (  int     j       int     n       vector   <  int  >     &  board       vector   <  bool  >     &  rows           vector   <  bool  >     &  diag1       vector   <  bool  >     &  diag2       vector   <  vector   <  int  >>     &  res  )     {          if     (  j     >     n  )     {      // A solution is found      res  .  push_back  (  board  );      return  ;      }      for     (  int     i     =     1  ;     i      <=     n  ;     ++  i  )     {      if     (  !  rows  [  i  ]     &&     !  diag1  [  i     +     j  ]     &&     !  diag2  [  i     -     j     +     n  ])     {      // Place queen      rows  [  i  ]     =     diag1  [  i     +     j  ]     =     diag2  [  i     -     j     +     n  ]     =     true  ;      board  .  push_back  (  i  );      // Recurse to the next column      nQueenUtil  (  j     +     1       n       board       rows       diag1       diag2       res  );      // Remove queen (backtrack)      board  .  pop_back  ();      rows  [  i  ]     =     diag1  [  i     +     j  ]     =     diag2  [  i     -     j     +     n  ]     =     false  ;      }      }   }   // Solves the N-Queens problem and returns   // all valid configurations.   vector   <  vector   <  int  >>     nQueen  (  int     n  )     {      vector   <  vector   <  int  >>     res  ;      vector   <  int  >     board  ;      // Rows occupied      vector   <  bool  >     rows  (  n     +     1       false  );      // Major diagonals (row + j) and Minor diagonals (row - col + n)      vector   <  bool  >     diag1  (  2     *     n     +     1       false  );      vector   <  bool  >     diag2  (  2     *     n     +     1       false  );      // Start solving from the first column      nQueenUtil  (  1       n       board       rows       diag1       diag2       res  );      return     res  ;   }   int     main  ()     {      int     n     =     4  ;      vector   <  vector   <  int  >>     res     =     nQueen  (  n  );      for     (  int     i     =     0  ;     i      <     res  .  size  ();     i  ++  )     {      cout      < <     '['  ;      for     (  int     j     =     0  ;     j      <     n  ;     ++  j  )     {      cout      < <     res  [  i  ][  j  ];      if     (  j     !=     n     -     1  )      cout      < <     ' '  ;      }      cout      < <     ']  n  '  ;      }      return     0  ;   }   
Java
   // Java program to find all solutions of the N-Queens problem   // using backtracking and pruning   import     java.util.ArrayList  ;   import     java.util.List  ;   class   GfG     {      // Utility function for solving the N-Queens      // problem using backtracking.      static     void     nQueenUtil  (  int     j       int     n       ArrayList   <  Integer  >     board       boolean  []     rows        boolean  []     diag1       boolean  []     diag2       ArrayList   <  ArrayList   <  Integer  >>     res  )     {      if     (  j     >     n  )     {      // A solution is found      res  .  add  (  new     ArrayList   <>  (  board  ));      return  ;      }      for     (  int     i     =     1  ;     i      <=     n  ;     ++  i  )     {      if     (  !  rows  [  i  ]     &&     !  diag1  [  i     +     j  ]     &&     !  diag2  [  i     -     j     +     n  ]  )     {      // Place queen      rows  [  i  ]     =     diag1  [  i     +     j  ]     =     diag2  [  i     -     j     +     n  ]     =     true  ;      board  .  add  (  i  );      // Recurse to the next column      nQueenUtil  (  j     +     1       n       board       rows       diag1       diag2       res  );      // Remove queen (backtrack)      board  .  remove  (  board  .  size  ()     -     1  );      rows  [  i  ]     =     diag1  [  i     +     j  ]     =     diag2  [  i     -     j     +     n  ]     =     false  ;      }      }      }      // Solves the N-Queens problem and returns      // all valid configurations.      static     ArrayList   <  ArrayList   <  Integer  >>     nQueen  (  int     n  )     {      ArrayList   <  ArrayList   <  Integer  >>     res     =     new     ArrayList   <>  ();      ArrayList   <  Integer  >     board     =     new     ArrayList   <>  ();      // Rows occupied      boolean  []     rows     =     new     boolean  [  n     +     1  ]  ;      // Major diagonals (row + j) and Minor diagonals (row - col + n)      boolean  []     diag1     =     new     boolean  [  2     *     n     +     1  ]  ;      boolean  []     diag2     =     new     boolean  [  2     *     n     +     1  ]  ;      // Start solving from the first column      nQueenUtil  (  1       n       board       rows       diag1       diag2       res  );      return     res  ;      }      public     static     void     main  (  String  []     args  )     {      int     n     =     4  ;      ArrayList   <  ArrayList   <  Integer  >>     res     =     nQueen  (  n  );      for     (  ArrayList   <  Integer  >     solution     :     res  )     {      System  .  out  .  print  (  '['  );      for     (  int     i     =     0  ;     i      <     solution  .  size  ();     i  ++  )     {      System  .  out  .  print  (  solution  .  get  (  i  ));      if     (  i     !=     solution  .  size  ()     -     1  )     {      System  .  out  .  print  (  ' '  );      }      }      System  .  out  .  println  (  ']'  );      }      }   }   
Python
   # Python program to find all solutions of the N-Queens problem   # using backtracking and pruning   def   nQueenUtil  (  j     n     board     rows     diag1     diag2     res  ):   if   j   >   n  :   # A solution is found   res  .  append  (  board  [:])   return   for   i   in   range  (  1     n   +   1  ):   if   not   rows  [  i  ]   and   not   diag1  [  i   +   j  ]   and   not   diag2  [  i   -   j   +   n  ]:   # Place queen   rows  [  i  ]   =   diag1  [  i   +   j  ]   =   diag2  [  i   -   j   +   n  ]   =   True   board  .  append  (  i  )   # Recurse to the next column   nQueenUtil  (  j   +   1     n     board     rows     diag1     diag2     res  )   # Remove queen (backtrack)   board  .  pop  ()   rows  [  i  ]   =   diag1  [  i   +   j  ]   =   diag2  [  i   -   j   +   n  ]   =   False   def   nQueen  (  n  ):   res   =   []   board   =   []   # Rows occupied   rows   =   [  False  ]   *   (  n   +   1  )   # Major diagonals (row + j) and Minor diagonals (row - col + n)   diag1   =   [  False  ]   *   (  2   *   n   +   1  )   diag2   =   [  False  ]   *   (  2   *   n   +   1  )   # Start solving from the first column   nQueenUtil  (  1     n     board     rows     diag1     diag2     res  )   return   res   if   __name__   ==   '__main__'  :   n   =   4   res   =   nQueen  (  n  )   for   temp   in   res  :   print  (  temp  )   
C#
   // C# program to find all solutions of the N-Queens problem   // using backtracking and pruning   using     System  ;   using     System.Collections.Generic  ;   class     GfG     {      // Utility function for solving the N-Queens      // problem using backtracking.      static     void     nQueenUtil  (  int     j       int     n       List   <  int  >     board       bool  []     rows        bool  []     diag1       bool  []     diag2       List   <  List   <  int  >>     res  )     {      if     (  j     >     n  )     {      // A solution is found      res  .  Add  (  new     List   <  int  >  (  board  ));      return  ;      }      for     (  int     i     =     1  ;     i      <=     n  ;     ++  i  )     {      if     (  !  rows  [  i  ]     &&     !  diag1  [  i     +     j  ]     &&     !  diag2  [  i     -     j     +     n  ])     {      // Place queen      rows  [  i  ]     =     diag1  [  i     +     j  ]     =     diag2  [  i     -     j     +     n  ]     =     true  ;      board  .  Add  (  i  );      // Recurse to the next column      nQueenUtil  (  j     +     1       n       board       rows       diag1       diag2       res  );      // Remove queen (backtrack)      board  .  RemoveAt  (  board  .  Count     -     1  );      rows  [  i  ]     =     diag1  [  i     +     j  ]     =     diag2  [  i     -     j     +     n  ]     =     false  ;      }      }      }      // Solves the N-Queens problem and returns      // all valid configurations.      static     List   <  List   <  int  >>     nQueen  (  int     n  )     {      List   <  List   <  int  >>     res     =     new     List   <  List   <  int  >>  ();      List   <  int  >     board     =     new     List   <  int  >  ();      // Rows occupied      bool  []     rows     =     new     bool  [  n     +     1  ];      // Major diagonals (row + j) and Minor diagonals (row - col + n)      bool  []     diag1     =     new     bool  [  2     *     n     +     1  ];      bool  []     diag2     =     new     bool  [  2     *     n     +     1  ];      // Start solving from the first column      nQueenUtil  (  1       n       board       rows       diag1       diag2       res  );      return     res  ;      }      static     void     Main  (  string  []     args  )     {      int     n     =     4  ;      List   <  List   <  int  >>     res     =     nQueen  (  n  );      foreach     (  var     temp     in     res  )     {      Console  .  WriteLine  (  '['     +     String  .  Join  (  ' '       temp  )     +     ']'  );      }      }   }   
JavaScript
   // JavaScript program to find all solutions of the N-Queens problem   // using backtracking and pruning   // Utility function for solving the N-Queens   // problem using backtracking.   function     nQueenUtil  (  j       n       board       rows       diag1       diag2       res  )     {      if     (  j     >     n  )     {      // A solution is found      res  .  push  ([...  board  ]);      return  ;      }      for     (  let     i     =     1  ;     i      <=     n  ;     ++  i  )     {      if     (  !  rows  [  i  ]     &&     !  diag1  [  i     +     j  ]     &&     !  diag2  [  i     -     j     +     n  ])     {      // Place queen      rows  [  i  ]     =     diag1  [  i     +     j  ]     =     diag2  [  i     -     j     +     n  ]     =     true  ;      board  .  push  (  i  );      // Recurse to the next column      nQueenUtil  (  j     +     1       n       board       rows       diag1       diag2       res  );      // Remove queen (backtrack)      board  .  pop  ();      rows  [  i  ]     =     diag1  [  i     +     j  ]     =     diag2  [  i     -     j     +     n  ]     =     false  ;      }      }   }   // Solves the N-Queens problem and returns   // all valid configurations.   function     nQueen  (  n  )     {      const     res     =     [];      const     board     =     [];      // Rows occupied      const     rows     =     Array  (  n     +     1  ).  fill  (  false  );      // Major diagonals (row + j) and Minor diagonals (row - col + n)      const     diag1     =     Array  (  2     *     n     +     1  ).  fill  (  false  );      const     diag2     =     Array  (  2     *     n     +     1  ).  fill  (  false  );      // Start solving from the first column      nQueenUtil  (  1       n       board       rows       diag1       diag2       res  );      return     res  ;   }   // Driver Code   const     n     =     4  ;   const     res     =     nQueen  (  n  );   res  .  forEach  (  temp     =>     console  .  log  (  temp  ));   

Produksjon
[2 4 1 3] [3 1 4 2]  

Tidskompleksitet: O(n!) For å generere alle permutasjoner .
Hjelpeplass: På)

[Alternativ tilnærming] - Tilbakesporing ved hjelp av bitmaskering

For ytterligere å optimalisere tilbakesporing tilnærming spesielt for større verdier av n vi kan bruke bit-maskering å spore effektivt okkupert rader og diagonaler. Bit-maskering lar oss bruke heltall ( rader ld rd ) for å spore hvilke rader og diagonaler som er opptatt ved å bruke hurtig bitvise operasjoner for raskere beregninger. Tilnærmingen forblir den samme som ovenfor.

Nedenfor er gitt implementering:

C++
   //C++ program to find all solution of N queen problem    //using recursion   #include          #include         using     namespace     std  ;   // Function to check if the current placement is safe   bool     isSafe  (  int     row       int     col       int     rows       int     ld       int     rd       int     n  )     {      return     !  ((  rows     >>     row  )     &     1  )     &&     !  ((  ld     >>     (  row     +     col  ))     &     1  )     &&     !  ((  rd     >>     (  row     -     col     +     n  ))     &     1  );   }   // Recursive function to generate all possible permutations   void     nQueenUtil  (  int     col       int     n       vector   <  int  >&     board           vector   <  vector   <  int  >>&     res       int     rows       int     ld       int     rd  )     {      // If all queens are placed add into res      if  (  col     >     n  )     {      res  .  push_back  (  board  );      return  ;      }      // Try placing a queen in each row      // of the current column      for  (  int     row     =     1  ;     row      <=     n  ;     ++  row  )     {      // Check if it's safe to place the queen      if  (  isSafe  (  row       col       rows       ld       rd       n  ))     {          // Place the queen      board  .  push_back  (  row  );         // Recur to place the next queen      nQueenUtil  (  col     +     1       n       board        res       rows     |     (  1      < <     row  )         (  ld     |     (  1      < <     (  row     +     col  )))         (  rd     |     (  1      < <     (  row     -     col     +     n  ))));      // Backtrack: remove the queen      board  .  pop_back  ();         }      }       }      // Main function to find all distinct    // res to the n-queens puzzle   vector   <  vector   <  int  >>     nQueen  (  int     n  )     {      vector   <  vector   <  int  >>     res  ;         // Current board configuration      vector   <  int  >     board  ;             // Start solving from the first column      nQueenUtil  (  1       n       board       res       0       0       0  );      return     res  ;      }   int     main  ()     {      int     n     =     4  ;         vector   <  vector   <  int  >>     res     =     nQueen  (  n  );         for  (  int     i     =     0  ;  i      <     res  .  size  ();     i  ++  )     {      cout      < <     '['  ;      for  (  int     j     =     0  ;     j      <     n  ;     ++  j  )     {      cout      < <     res  [  i  ][  j  ];         if  (  j     !=     n     -     1  )     cout      < <     ' '  ;         }      cout      < <     ']  n  '  ;      }      return     0  ;   }   
Java
   // Java program to find all solution of N queen problem    // using recursion   import     java.util.*  ;   class   GfG     {      // Function to check if the current placement is safe      static     boolean     isSafe  (  int     row       int     col       int     rows       int     ld       int     rd       int     n  )     {      return     !  (((  rows     >>     row  )     &     1  )     ==     1  )     &&     !  (((  ld     >>     (  row     +     col  ))     &     1  )     ==     1  )         &&     !  (((  rd     >>     (  row     -     col     +     n  ))     &     1  )     ==     1  );      }      // Recursive function to generate all possible permutations      static     void     nQueenUtil  (  int     col       int     n       ArrayList   <  Integer  >     board           ArrayList   <  ArrayList   <  Integer  >>     res       int     rows       int     ld       int     rd  )     {      // If all queens are placed add into res      if     (  col     >     n  )     {      res  .  add  (  new     ArrayList   <>  (  board  ));      return  ;      }      // Try placing a queen in each row      // of the current column      for     (  int     row     =     1  ;     row      <=     n  ;     ++  row  )     {      // Check if it's safe to place the queen      if     (  isSafe  (  row       col       rows       ld       rd       n  ))     {      // Place the queen      board  .  add  (  row  );      // Recur to place the next queen      nQueenUtil  (  col     +     1       n       board       res           rows     |     (  1      < <     row  )     (  ld     |     (  1      < <     (  row     +     col  )))         (  rd     |     (  1      < <     (  row     -     col     +     n  ))));      // Backtrack: remove the queen      board  .  remove  (  board  .  size  ()     -     1  );      }      }      }      // Main function to find all distinct       // res to the n-queens puzzle      static     ArrayList   <  ArrayList   <  Integer  >>     nQueen  (  int     n  )     {      ArrayList   <  ArrayList   <  Integer  >>     res     =     new     ArrayList   <>  ();      // Current board configuration      ArrayList   <  Integer  >     board     =     new     ArrayList   <>  ();      // Start solving from the first column      nQueenUtil  (  1       n       board       res       0       0       0  );      return     res  ;      }      public     static     void     main  (  String  []     args  )     {      int     n     =     4  ;      ArrayList   <  ArrayList   <  Integer  >>     res     =     nQueen  (  n  );      for     (  ArrayList   <  Integer  >     solution     :     res  )     {      System  .  out  .  print  (  '['  );      for     (  int     j     =     0  ;     j      <     n  ;     ++  j  )     {      System  .  out  .  print  (  solution  .  get  (  j  ));      if     (  j     !=     n     -     1  )     System  .  out  .  print  (  ' '  );      }      System  .  out  .  println  (  ']'  );      }      }   }   
Python
   # Python program to find all solution of N queen problem    # using recursion   # Function to check if the current placement is safe   def   isSafe  (  row     col     rows     ld     rd     n  ):   return   not   ((  rows   >>   row  )   &   1  )   and    not   ((  ld   >>   (  row   +   col  ))   &   1  )   and    not   ((  rd   >>   (  row   -   col   +   n  ))   &   1  )   # Recursive function to generate all possible permutations   def   nQueenUtil  (  col     n     board     res     rows     ld     rd  ):   # If all queens are placed add into res   if   col   >   n  :   res  .  append  (  board  [:])   return   # Try placing a queen in each row   # of the current column   for   row   in   range  (  1     n   +   1  ):   # Check if it's safe to place the queen   if   isSafe  (  row     col     rows     ld     rd     n  ):   # Place the queen   board  .  append  (  row  )   # Recur to place the next queen   nQueenUtil  (  col   +   1     n     board     res     rows   |   (  1    < <   row  )   (  ld   |   (  1    < <   (  row   +   col  )))   (  rd   |   (  1    < <   (  row   -   col   +   n  ))))   # Backtrack: remove the queen   board  .  pop  ()   # Main function to find all distinct    # res to the n-queens puzzle   def   nQueen  (  n  ):   res   =   []   # Current board configuration   board   =   []   # Start solving from the first column   nQueenUtil  (  1     n     board     res     0     0     0  )   return   res   if   __name__   ==   '__main__'  :   n   =   4   res   =   nQueen  (  n  )   for   solution   in   res  :   print  (  '['     end  =  ''  )   for   j   in   range  (  n  ):   print  (  solution  [  j  ]   end  =  ''  )   if   j   !=   n   -   1  :   print  (  ' '     end  =  ''  )   print  (  ']'  )   
C#
   // C# program to find all solution of N queen problem    // using recursion   using     System  ;   using     System.Collections.Generic  ;   class     GfG     {          // Function to check if the current placement is safe      static     bool     isSafe  (  int     row       int     col       int     rows       int     ld       int     rd       int     n  )     {      return     !  (((  rows     >>     row  )     &     1  )     ==     1  )     &&     !  (((  ld     >>     (  row     +     col  ))     &     1  )     ==     1  )         &&     !  (((  rd     >>     (  row     -     col     +     n  ))     &     1  )     ==     1  );      }      // Recursive function to generate all possible permutations      static     void     nQueenUtil  (  int     col       int     n       List   <  int  >     board           List   <  List   <  int  >>     res       int     rows       int     ld       int     rd  )     {      // If all queens are placed add into res      if     (  col     >     n  )     {      res  .  Add  (  new     List   <  int  >  (  board  ));      return  ;      }      // Try placing a queen in each row      // of the current column      for     (  int     row     =     1  ;     row      <=     n  ;     ++  row  )     {      // Check if it's safe to place the queen      if     (  isSafe  (  row       col       rows       ld       rd       n  ))     {      // Place the queen      board  .  Add  (  row  );      // Recur to place the next queen      nQueenUtil  (  col     +     1       n       board       res           rows     |     (  1      < <     row  )     (  ld     |     (  1      < <     (  row     +     col  )))         (  rd     |     (  1      < <     (  row     -     col     +     n  ))));      // Backtrack: remove the queen      board  .  RemoveAt  (  board  .  Count     -     1  );      }      }      }      // Main function to find all distinct       // res to the n-queens puzzle      static     List   <  List   <  int  >>     nQueen  (  int     n  )     {      List   <  List   <  int  >>     res     =     new     List   <  List   <  int  >>  ();      // Current board configuration      List   <  int  >     board     =     new     List   <  int  >  ();      // Start solving from the first column      nQueenUtil  (  1       n       board       res       0       0       0  );      return     res  ;      }      static     void     Main  ()     {      int     n     =     4  ;      List   <  List   <  int  >>     res     =     nQueen  (  n  );      foreach     (  var     solution     in     res  )     {      Console  .  Write  (  '['  );      for     (  int     j     =     0  ;     j      <     n  ;     ++  j  )     {      Console  .  Write  (  solution  [  j  ]);      if     (  j     !=     n     -     1  )     Console  .  Write  (  ' '  );      }      Console  .  WriteLine  (  ']'  );      }      }   }   
JavaScript
   // JavaScript program to find all solution of N queen problem    // using recursion   // Function to check if the current placement is safe   function     isSafe  (  row       col       rows       ld       rd       n  )     {      return     !  ((  rows     >>     row  )     &     1  )     &&         !  ((  ld     >>     (  row     +     col  ))     &     1  )     &&         !  ((  rd     >>     (  row     -     col     +     n  ))     &     1  );   }   // Recursive function to generate all possible permutations   function     nQueenUtil  (  col       n       board       res       rows       ld       rd  )     {      // If all queens are placed add into res      if     (  col     >     n  )     {      res  .  push  ([...  board  ]);      return  ;      }      // Try placing a queen in each row      // of the current column      for     (  let     row     =     1  ;     row      <=     n  ;     ++  row  )     {      // Check if it's safe to place the queen      if     (  isSafe  (  row       col       rows       ld       rd       n  ))     {      // Place the queen      board  .  push  (  row  );      // Recur to place the next queen      nQueenUtil  (  col     +     1       n       board       res           rows     |     (  1      < <     row  )     (  ld     |     (  1      < <     (  row     +     col  )))         (  rd     |     (  1      < <     (  row     -     col     +     n  ))));      // Backtrack: remove the queen      board  .  pop  ();      }      }   }   // Main function to find all distinct    // res to the n-queens puzzle   function     nQueen  (  n  )     {      let     res     =     [];      // Current board configuration      let     board     =     [];      // Start solving from the first column      nQueenUtil  (  1       n       board       res       0       0       0  );      return     res  ;   }   // Driver Code   let     n     =     4  ;   let     res     =     nQueen  (  n  );   for     (  let     i     =     0  ;     i      <     res  .  length  ;     i  ++  )     {      process  .  stdout  .  write  (  '['  );      for     (  let     j     =     0  ;     j      <     n  ;     ++  j  )     {      process  .  stdout  .  write  (  res  [  i  ][  j  ].  toString  ());      if     (  j     !==     n     -     1  )     process  .  stdout  .  write  (  ' '  );      }      console  .  log  (  ']'  );   }   

Produksjon
[2 4 1 3] [3 1 4 2]  

Tidskompleksitet: O(n!) for å generere alle permutasjoner.
Plass kompleksitet: På)

Lag quiz