Bir tamsayı verildiğinde N görev hepsini bulmak farklı çözümler -e n-kraliçe sorunu Neresi N kraliçeler bir yere yerleştirilir n * n iki vezir birbirine saldıramayacak şekilde satranç tahtası.
Not: Her çözüm, benzersiz bir yapılandırmadır N kraliçeler şunun bir permütasyonu olarak temsil edilir: [123....n] . Numaradaki numara Ben o pozisyon vezir sırasını gösterir Ben o kolon. Örneğin [3142] böyle bir düzeni gösterir.
Örnek:
Giriş: n = 4
Çıkış: [2 4 1 3] [3 1 4 2]![]()
Açıklama : Bunlar olası 2 çözümdür.Giriş: n = 2
Çıkış: []
Açıklama: Kraliçeler olası tüm konfigürasyonlarda birbirlerine saldırabileceğinden çözüm yok.
İçerik Tablosu
- [Naif Yaklaşım] Özyinelemeyi Kullanarak Tüm Permütasyonları Oluşturarak
- [Beklenen Yaklaşım] Budama ile Geri İzlemeyi Kullanma
- [Alternatif Yaklaşım] Bit Maskeleme Kullanarak Geri İzleme
[Naif Yaklaşım] - Özyinelemeyi Kullanmak - O(n! * n) Zaman ve O(n) Uzay
Sorunu çözmek için basit bir fikir N-Queens sorunu mümkün olan tüm permütasyonları oluşturmaktır. [1 2 3 ... n] ve ardından geçerli bir N-Queens yapılandırmasını temsil edip etmediğini kontrol edin. Her kraliçenin farklı bir satır ve sütunda olması gerektiğinden permütasyonları otomatik olarak kullanma bu kurallara dikkat eder. Ama yine de iki vezir olup olmadığını kontrol etmemiz gerekiyor. aynı diyagonal.
Aşağıda verilmiştir uygulama:
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));
Çıkış
[2 4 1 3] [3 1 4 2]
Zaman Karmaşıklığı: O(n!*n)n! hepsini ürettiğin için permütasyonlar ve her permütasyonun doğrulanması için O(n).
Yardımcı Alan: Açık)
[Beklenen Yaklaşım] - Budama ile Geri İzlemeyi Kullanma - O(n!) Zaman ve O(n) Uzay
Yukarıdaki yaklaşımı optimize etmek için kullanabiliriz budama ile geriye doğru izleme . Olası tüm permütasyonları üretmek yerine çözümü artımlı olarak oluştururuz ve bunu yaparken her adımda kısmi çözümün geçerli kalmasını sağlayabiliriz. Bir çakışma meydana gelirse hemen geri adım atarız, bu yardımcı olur kaçınmak gereksiz hesaplamalar .
java'da repl
Adım adım uygulama :
- İlk sütundan başlayın ve her sıraya bir kraliçe yerleştirmeyi deneyin.
- Hangisini izlemek için dizileri tutun satırlar zaten işgal edilmiş durumdalar. Benzer şekilde izleme için ana Ve küçük köşegenler zaten işgal edilmiş durumdalar.
- Eğer bir kraliçe atama mevcut kraliçelerle çatışmalar atlamak O sıra Ve geri adım atmak kraliçe bir sonrakini deneyecek olası satır (Çatışma sırasında budama ve geri izleme).
// 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));
Çıkış
[2 4 1 3] [3 1 4 2]
Zaman karmaşıklığı: O(n!) Tümünü oluşturmak için permütasyonlar .
Yardımcı Alan: Açık)
[Alternatif Yaklaşım] - Bit Maskeleme Kullanarak Geri İzleme
Daha da optimize etmek için geriye doğru izleme özellikle daha büyük değerler için yaklaşım N kullanabiliriz bit maskeleme verimli bir şekilde takip etmek dolu satırlar ve köşegenler. Bit maskeleme tamsayıları kullanmamıza izin verir ( satırlar ld rd ) hızlı kullanarak hangi satırların ve köşegenlerin dolu olduğunu takip etmek için bit düzeyinde işlemler daha hızlı hesaplamalar. Yaklaşım yukarıdakiyle aynı kalır.
Aşağıda verilmiştir uygulama:
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(']'); }
Çıkış
[2 4 1 3] [3 1 4 2]
Zaman Karmaşıklığı: Tüm permütasyonları oluşturmak için O(n!).
Uzay Karmaşıklığı: Açık)