N Queen Проблема
Ми обговорили Лицарський тур і Щур в лабіринті проблеми раніше як приклади проблем зворотного відстеження. Давайте обговоримо N Queen як ще один приклад проблеми, яку можна розв’язати за допомогою відстеження.
Що таке проблема N-Queen?
The Н Королева - це проблема розміщення Н шахові ферзі на ан N×N шахової дошки, щоб два ферзі не атакували один одного.
Наприклад, нижче наведено розв’язок задачі 4 королеви.
Очікуваний вихід має форму матриці, яка має Q для блоків, де розміщені ферзі та порожні місця представлені '.' . Наприклад, нижче наведено вихідну матрицю для вищевказаного рішення 4 ферзев.
Рекомендовано: розв’яжіть це на ПРАКТИКА спочатку, перш ніж перейти до рішення.. Q . .
. . . Q
Q . . .
. . Q .
N Queen Проблема використання Відстеження назад :
Ідея полягає в тому, щоб розмістити ферзів одну за одною в різних колонках, починаючи з крайньої лівої колонки. Коли ми розставляємо ферзя в колоні, ми перевіряємо зіткнення з уже розміщеними ферзями. Якщо в поточному стовпці ми знаходимо рядок, для якого немає зіткнень, ми позначаємо цей рядок і стовпець як частину рішення. Якщо ми не знаходимо такого ряду через зіткнення, то повертаємося назад і повертаємося помилковий .
Нижче наведено рекурсивне дерево описаного вище підходу:
Рекурсивне дерево для проблеми N Queen
Щоб реалізувати ідею, виконайте наведені нижче кроки:
- Почніть із крайньої лівої колонки
- Якщо всі ферзі розміщені, повертається true
- Спробуйте всі рядки в поточному стовпці. Виконайте наступні дії для кожного ряду.
- Якщо ферзя можна безпечно розмістити в цьому ряду
- Тоді позначте це [рядок, стовпець] як частину розв’язку та рекурсивно перевірити, чи веде розміщення тут ферзя до розв’язку.
- Якщо поставити ферзя [рядок, стовпець] призводить до вирішення, а потім повертається правда .
- Якщо розміщення ферзя не приведе до рішення, зніміть позначку [рядок, стовпець] потім поверніться назад і спробуйте інші рядки.
- Якщо всі рядки випробувано, але дійсне рішення не знайдено, повертається помилковий щоб запустити відстеження.
- Якщо ферзя можна безпечно розмістити в цьому ряду
Для кращої візуалізації цього підходу зворотного відстеження див Проблема 4 королеви .
Примітка: Ми також можемо вирішити цю проблему, розставивши ферзів у ряди.
Нижче наведено реалізацію вищезазначеного підходу:
C++
// C++ program to solve N Queen Problem using backtracking> #include> #define N 4> using> namespace> std;> // A utility function to print solution> void> printSolution(> int> board[N][N])> {> > for> (> int> i = 0; i for (int j = 0; j if(board[i][j]) cout < < 'Q '; else cout < <'. '; printf('
'); } } // A utility function to check if a queen can // be placed on board[row][col]. Note that this // function is called when 'col' queens are // already placed in columns from 0 to col -1. // So we need to check only left side for // attacking queens bool isSafe(int board[N][N], int row, int col) { int i, j; // Check this row on left side for (i = 0; i if (board[row][i]) return false; // Check upper diagonal on left side for (i = row, j = col; i>= 0 && j>= 0; i--, j--) if (board[i][j]) повертає false; // Перевірте нижню діагональ ліворуч на наявність (i = row, j = col; j>= 0 && i if (board[i][j]) return false; return true; } // Рекурсивна корисна функція для вирішення N // Проблема з ферзями bool solveNQUtil(int board[N][N], int col) { // базовий випадок: якщо всі ферзі розміщені // повертає true if (col>= N) return true; // Розглянемо цей стовпець і спробуйте розмістити // цього ферзя в усіх рядках один за одним for (int i = 0; i // Перевірити, чи можна розмістити ферзя на // дошці[i][col] if (isSafe(board, i, col) ) { // Розмістіть цей ферзь на дошці[i][col] board[i][col] = 1; // повторно розмістіть ферзя if (solveNQUtil(board, col + 1)) return true; Якщо розміщення ферзя на дошці [i][col] // не призводить до вирішення, тоді // видаліть ферзя з дошки [i][col] board[i][col] = 0; // BACKTRACK } } // Якщо ферзь не може бути розміщений у // цьому стовпці, повертає false return false; } // Ця функція вирішує проблему N ферзя, // здебільшого використовує solveNQUtil(). . Він повертає false, якщо ферзів // не можна поставити, інакше повертає true та // друкує розташування ферзів у формі 1s. // Зауважте, що може бути декілька // рішень, ця функція друкує одне з // можливих рішень. bool solveNQ() { int board[N][N] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; if (solveNQUtil(board, 0) == false) { cout < < 'Solution does not exist'; return false; } printSolution(board); return true; } // Driver program to test above function int main() { solveNQ(); return 0; } // This code is contributed by Aditya Kumar (adityakumar129)> |
C
// C program to solve N Queen Problem using backtracking> #define N 4> #include> #include> // A utility function to print solution> void> printSolution(> int> board[N][N])> {> > for> (> int> i = 0; i for (int j = 0; j if(board[i][j]) printf('Q '); else printf('. '); } printf('
'); } } // A utility function to check if a queen can // be placed on board[row][col]. Note that this // function is called when 'col' queens are // already placed in columns from 0 to col -1. // So we need to check only left side for // attacking queens bool isSafe(int board[N][N], int row, int col) { int i, j; // Check this row on left side for (i = 0; i if (board[row][i]) return false; // Check upper diagonal on left side for (i = row, j = col; i>= 0 && j>= 0; i--, j--) if (board[i][j]) повертає false; // Перевірте нижню діагональ ліворуч на наявність (i = row, j = col; j>= 0 && i if (board[i][j]) return false; return true; } // Рекурсивна корисна функція для вирішення N // Проблема з ферзями bool solveNQUtil(int board[N][N], int col) { // Базовий випадок: якщо всі ферзі розміщені // повертає true if (col>= N) return true; // Розглянемо цей стовпець і спробуйте розмістити // цього ферзя в усіх рядках один за одним for (int i = 0; i // Перевірити, чи можна розмістити ферзя на // дошці[i][col] if (isSafe(board, i, col) ) { // Поставте цей ферзь на дошку [i][col] board[i][col] = 1; Якщо розміщення ферзя на дошці [i][col] // не призводить до вирішення, тоді // видаліть ферзя з дошки [i][col] board[i][col] = 0; // BACKTRACK } } // Якщо ферзь не може бути розміщений у // цьому стовпці, повертає false return false; } // Ця функція вирішує проблему N ферзя, // здебільшого використовує solveNQUtil(). . Повертає false, якщо ферзів // не можна поставити, інакше повертає true та // друкує розташування ферзів у формі 1s. // Зауважте, що може бути декілька // рішень, ця функція друкує одне з // можливих рішень. bool solveNQ() { int board[N][N] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; if (solveNQUtil(board, 0) == false) { printf('Рішення не існує'); повернути false; } printSolution(board); повернути істину; } // Програма драйвера для тестування вище function int main() { solveNQ(); повернути 0; } // Цей код створено Aditya Kumar (adityakumar129)> |
Java
// Java program to solve N Queen Problem using backtracking> public> class> NQueenProblem {> > final> int> N => 4> ;> > // A utility function to print solution> > void> printSolution(> int> board[][])> > {> > for> (> int> i => 0> ; i for (int j = 0; j if (board[i][j] == 1) System.out.print('Q '); else System.out.print('. '); } System.out.println(); } } // A utility function to check if a queen can // be placed on board[row][col]. Note that this // function is called when 'col' queens are already // placeed in columns from 0 to col -1. So we need // to check only left side for attacking queens boolean isSafe(int board[][], int row, int col) { int i, j; // Check this row on left side for (i = 0; i if (board[row][i] == 1) return false; // Check upper diagonal on left side for (i = row, j = col; i>= 0 && j>= 0; i--, j--) if (board[i][j] == 1) повертає false; // Перевірте нижню діагональ ліворуч на наявність (i = row, j = col; j>= 0 && i if (board[i][j] == 1) return false; return true; } // Рекурсивна корисна функція вирішити N // Проблема з ферзями boolean solveNQUtil(int board[][], int col) { // Базовий випадок: якщо всі ферзі розміщені // тоді повертається true if (col>= N) return true; // Розглянемо це і спробуйте розмістити // цього ферзя в усіх рядках один за одним for (int i = 0; i // Перевірте, чи можна розмістити ферзя на // дошці[i][col] if (isSafe(board, i, col) )) { // Поставте цього ферзя на дошку [i][col] board[i][col] = 1; true; // Якщо розміщення ферзя на дошці [i][col] // не приводить до вирішення, то // видаліть ферзя з дошки [i][col] = 0; BACKTRACK } } // Якщо ферзь не може бути розміщений у // цьому стовпці, повертає false return false; } // Ця функція вирішує проблему N ферзя // Для цього використовується solveNQUtil (). // вирішити проблему. Він повертає false, якщо ферзів // не можна поставити, інакше повертає true та // друкує розташування ферзів у формі 1s. // Зауважте, що може бути декілька // рішень, ця функція друкує одне з // можливих рішень. boolean solveNQ() { int board[][] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; if (solveNQUtil(board, 0) == false) { System.out.print('Рішення не існує'); повернути false; } printSolution(board); повернути істину; } // Програма драйвера для перевірки вищевказаної функції public static void main(String args[]) { NQueenProblem Queen = new NQueenProblem(); Queen.solveNQ(); } } // Цей код створено Абхішеком Шанхадхаром> |
Python3
# Python3 program to solve N Queen> # Problem using backtracking> global> N> N> => 4> def> printSolution(board):> > for> i> in> range> (N):> > for> j> in> range> (N):> > if> board[i][j]> => => 1> :> > print> (> 'Q'> ,end> => ' '> )> > else> :> > print> (> '.'> ,end> => ' '> )> > print> ()> # A utility function to check if a queen can> # be placed on board[row][col]. Note that this> # function is called when 'col' queens are> # already placed in columns from 0 to col -1.> # So we need to check only left side for> # attacking queens> def> isSafe(board, row, col):> > # Check this row on left side> > for> i> in> range> (col):> > if> board[row][i]> => => 1> :> > return> False> > # Check upper diagonal on left side> > for> i, j> in> zip> (> range> (row,> -> 1> ,> -> 1> ),> > range> (col,> -> 1> ,> -> 1> )):> > if> board[i][j]> => => 1> :> > return> False> > # Check lower diagonal on left side> > for> i, j> in> zip> (> range> (row, N,> 1> ),> > range> (col,> -> 1> ,> -> 1> )):> > if> board[i][j]> => => 1> :> > return> False> > return> True> def> solveNQUtil(board, col):> > # Base case: If all queens are placed> > # then return true> > if> col>> => N:> > return> True> > # Consider this column and try placing> > # this queen in all rows one by one> > for> i> in> range> (N):> > if> isSafe(board, i, col):> > # Place this queen in board[i][col]> > board[i][col]> => 1> > # Recur to place rest of the queens> > if> solveNQUtil(board, col> +> 1> )> => => True> :> > return> True> > # If placing queen in board[i][col> > # doesn't lead to a solution, then> > # queen from board[i][col]> > board[i][col]> => 0> > # If the queen can not be placed in any row in> > # this column col then return false> > return> False> # This function solves the N Queen problem using> # Backtracking. It mainly uses solveNQUtil() to> # solve the problem. It returns false if queens> # cannot be placed, otherwise return true and> # placement of queens in the form of 1s.> # note that there may be more than one> # solutions, this function prints one of the> # feasible solutions.> def> solveNQ():> > board> => [[> 0> ,> 0> ,> 0> ,> 0> ],> > [> 0> ,> 0> ,> 0> ,> 0> ],> > [> 0> ,> 0> ,> 0> ,> 0> ],> > [> 0> ,> 0> ,> 0> ,> 0> ]]> > if> solveNQUtil(board,> 0> )> => => False> :> > print> (> 'Solution does not exist'> )> > return> False> > printSolution(board)> > return> True> # Driver Code> if> __name__> => => '__main__'> :> > solveNQ()> # This code is contributed by Divyanshu Mehta> |
C#
// C# program to solve N Queen Problem> // using backtracking> using> System;> > class> GFG> {> > readonly> int> N = 4;> > // A utility function to print solution> > void> printSolution(> int> [,]board)> > {> > for> (> int> i = 0; i { for (int j = 0; j { if (board[i, j] == 1) Console.Write('Q '); else Console.Write('. '); } Console.WriteLine(); } } // A utility function to check if a queen can // be placed on board[row,col]. Note that this // function is called when 'col' queens are already // placeed in columns from 0 to col -1. So we need // to check only left side for attacking queens bool isSafe(int [,]board, int row, int col) { int i, j; // Check this row on left side for (i = 0; i if (board[row,i] == 1) return false; // Check upper diagonal on left side for (i = row, j = col; i>= 0 && j>= 0; i--, j--) if (board[i,j] == 1) повертає false; // Перевірте нижню діагональ ліворуч на наявність (i = row, j = col; j>= 0 && i if (board[i, j] == 1) return false; return true; } // Рекурсивна допоміжна функція для solve N // Проблема з ферзями bool solveNQUtil(int [,]board, int col) { // Базовий випадок: якщо всі ферзі розміщені // повертає true if (col>= N) return true; // Розглянемо цей стовпець і спробуйте розмістити // цього ферзя в усіх рядках один за одним for (int i = 0; i { // Перевірте, чи можна розмістити ферзя // на дошці[i,col] if (isSafe(board, i, col)) { // Поставити цей ферзь на дошку [i, col] = 1; // Повторити, щоб розмістити решту ферзів if (solveNQUtil(board, col + 1) == true) return true; Якщо розміщення ферзя на дошці [i, col] // не призводить до вирішення, то // видалення ферзя з дошки [i, col] = 0; // BACKTRACK } } // Якщо ферзь не може бути розміщений у // цьому стовпці, тоді повертає false return false; // ця функція вирішує проблему N ферзя за допомогою // функції зворотного відстеження // для вирішення проблеми. Він повертає false, якщо ферзів // не можна поставити, інакше повертає true та // друкує розташування ферзів у формі 1s. // Зауважте, що може бути декілька // рішень, ця функція друкує одне з // можливих рішень. bool solveNQ() { int [,]board = {{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }}; if (solveNQUtil(board, 0) == false) { Console.Write('Рішення не існує'); повернути false; } printSolution(board); повернути істину; } // Код драйвера public static void Main(String []args) { GFG Queen = new GFG(); Queen.solveNQ(); } } // Цей код створено Прінсі Сінгхом> |
Javascript
> // JavaScript program to solve N Queen> // Problem using backtracking> const N = 4> function> printSolution(board)> {> > for> (let i = 0; i { for(let j = 0; j { if(board[i][j] == 1) document.write('Q ') else document.write('. ') } document.write('') } } // A utility function to check if a queen can // be placed on board[row][col]. Note that this // function is called when 'col' queens are // already placed in columns from 0 to col -1. // So we need to check only left side for // attacking queens function isSafe(board, row, col) { // Check this row on left side for(let i = 0; i if(board[row][i] == 1) return false } // Check upper diagonal on left side for (i = row, j = col; i>= 0 && j>= 0; i--, j--) if (board[i][j]) повертає false // Перевірте нижню діагональ ліворуч на наявність (i = row, j = col; j>= 0 && i if (board[i]) [j]) return false return true } function solveNQUtil(board, col){ // базовий випадок: якщо всі ферзі розміщені // тоді повертається true if(col>= N) return true // Розгляньте цей стовпець і спробуйте розмістити / / цей ферзь у всіх рядках один за одним for(let i=0;i if(isSafe(board, i, col)==true){ // Розмістіть цього ферзя на дошці[i][col] board[i][ col] = 1 // повторно розмістити решту ферзів if(solveNQUtil(board, col + 1) == true) return true // Якщо розміщення ферзя на дошці[i][col // не призводить до рішення, тоді // ферзь із дошки [i][col] board[i][col] = 0 } } // якщо ферзь не може бути розміщений у жодному рядку // цього стовпця col, тоді повертається false return false } / / Ця функція вирішує проблему N ферзів за допомогою // зворотного відстеження. Вона в основному використовує solveNQUtil() для // вирішення проблеми. Вона повертає false, якщо ферзі // не можуть бути розміщені, інакше повертає значення true та // розміщення ферзів у формі. 1с. // зверніть увагу, що може бути декілька // рішень, ця функція друкує одне з // можливих рішень. функція solveNQ(){ let board = [ [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0] ] якщо (solveNQUtil(board, 0) == false){ document.write('Рішення не існує') return false } printSolution(board) return true } // Код драйвера solveNQ() // Цей код надав shinjanpatra> |
Вихід
. . Q . Q . . . . . . Q . Q . .
Часова складність: О (Н!)
Допоміжний простір: O(N 2 )
Подальша оптимізація функції is_safe():
Ідея полягає не в тому, щоб перевіряти кожен елемент у правій і лівій діагоналі, замість цього використовувати властивість діагоналей:
- Сума i і j постійна і єдина для кожної правої діагоналі, де i є ряд елементів і j є
колонка елементів.- Різниця між i і j постійна і єдина для кожної лівої діагоналі, де i і j є рядком і стовпцем елемента відповідно.
Нижче наведено реалізацію:
C++
// C++ program to solve N Queen Problem using backtracking> #include> using> namespace> std;> #define N 4> // ld is an array where its indices indicate row-col+N-1> // (N-1) is for shifting the difference to store negative> // indices> int> ld[30] = { 0 };> // rd is an array where its indices indicate row+col> // and used to check whether a queen can be placed on> // right diagonal or not> int> rd[30] = { 0 };> // Column array where its indices indicates column and> // used to check whether a queen can be placed in that> // row or not*/> int> cl[30] = { 0 };> // A utility function to print solution> void> printSolution(> int> board[N][N])> {> > for> (> int> i = 0; i for (int j = 0; j cout < < ' ' < < (board[i][j]==1?'Q':'.') < < ' '; cout < < endl; } } // A recursive utility function to solve N // Queen problem bool solveNQUtil(int board[N][N], int col) { // Base case: If all queens are placed // then return true if (col>= N) повертає істину; // Розгляньте цей стовпець і спробуйте розмістити // цього ферзя в усіх рядках один за одним для (int i = 0; i // Перевірте, чи можна розмістити ферзя на // дошці[i][col] // Щоб перевірити, чи ферзя можна розмістити на // дошці [рядок][стовпець]. Нам просто потрібно перевірити // ld[рядок-стовпець+n-1] і rd[рядок+стовпець], де // ld і rd позначають лівий і вправо // діагональ відповідно if ((ld[i - col + N - 1] != 1 && rd[i + col] != 1) && cl[i] != 1) { // Розмістіть цього ферзя на дошці[ i][col] board[i][col] = 1; ld[i - col + N - 1] = rd[i + col] = cl[i] = 1; // Розставити решту ферзів (solveNQUtil(board, col + 1)) return true; // Якщо розміщення ферзя на дошці [i][col] // не призводить до вирішення, тоді // видаліть ферзя з дошки [i][col] board[i][col] = 0; // BACKTRACK ld[i - col + N - 1] = rd[i + col] = cl[i] = 0; } } // Якщо ферзь не може бути розміщений ні в якому місці row in // this column col then return false return false; } // Ця функція вирішує проблему N Queen, // в основному використовує solveNQUtil() для вирішення проблеми. Він повертає false, якщо ферзів // не можна поставити, інакше повертає true та // друкує розташування ферзів у формі 1s. // Зауважте, що може бути декілька // рішень, ця функція друкує одне з // можливих рішень. bool solveNQ() { int board[N][N] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; if (solveNQUtil(board, 0) == false) { cout < < 'Solution does not exist'; return false; } printSolution(board); return true; } // Driver program to test above function int main() { solveNQ(); return 0; } // This code is contributed by Aditya Kumar (adityakumar129)> |
Java
// Java program to solve N Queen Problem using backtracking> import> java.util.*;> class> GFG {> > static> int> N => 4> ;> > // ld is an array where its indices indicate row-col+N-1> > // (N-1) is for shifting the difference to store> > // negative indices> > static> int> [] ld => new> int> [> 30> ];> > // rd is an array where its indices indicate row+col> > // and used to check whether a queen can be placed on> > // right diagonal or not> > static> int> [] rd => new> int> [> 30> ];> > // Column array where its indices indicates column and> > // used to check whether a queen can be placed in that> > // row or not> > static> int> [] cl => new> int> [> 30> ];> > // A utility function to print solution> > static> void> printSolution(> int> board[][])> > {> > for> (> int> i => 0> ; i for (int j = 0; j System.out.printf(' %d ', board[i][j]); System.out.printf('
'); } } // A recursive utility function to solve N // Queen problem static boolean solveNQUtil(int board[][], int col) { // Base case: If all queens are placed // then return true if (col>= N) повертає істину; // Розгляньте цей стовпець і спробуйте розмістити // цього ферзя в усіх рядках один за одним для (int i = 0; i // Перевірте, чи можна розмістити ферзя на // дошці[i][col] // Щоб перевірити, чи ферзя можна розмістити на // дошці [рядок][стовпець]. Нам просто потрібно перевірити // ld[рядок-стовпець+n-1] і rd[рядок+стовпець], де // ld і rd позначають лівий і вправо // діагональ відповідно if ((ld[i - col + N - 1] != 1 && rd[i + col] != 1) && cl[i] != 1) { // Розмістіть цього ферзя на дошці[ i][col] board[i][col] = 1; ld[i - col + N - 1] = rd[i + col] = cl[i] = 1; // Розставити решту ферзів (solveNQUtil(board, col + 1)) return true; // Якщо розміщення ферзя на дошці [i][col] // не призводить до вирішення, тоді // видаліть ферзя з дошки [i][col] board[i][col] = 0; // BACKTRACK ld[i - col + N - 1] = rd[i + col] = cl[i] = 0; } } // Якщо ферзь не може бути розміщений ні в якому місці row in // this column col then return false return false; } // Ця функція вирішує проблему N Queen, // в основному використовує solveNQUtil() для вирішення проблеми. Він повертає false, якщо ферзів // не можна поставити, інакше повертає true та // друкує розташування ферзів у формі 1s. // Зауважте, що може бути декілька // рішень, ця функція друкує одне з // можливих рішень. static boolean solveNQ() { int board[][] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0 , 0 } }; if (solveNQUtil(board, 0) == false) { System.out.printf('Рішення не існує'); повернути false; } printSolution(board); повернути істину; } // Код драйвера public static void main(String[] args) { solveNQ(); } } // Цей код створено Прінсі Сінгхом> |
Python3
# Python3 program to solve N Queen Problem using> # backtracking> N> => 4> # ld is an array where its indices indicate row-col+N-1> # (N-1) is for shifting the difference to store negative> # indices> ld> => [> 0> ]> *> 30> # rd is an array where its indices indicate row+col> # and used to check whether a queen can be placed on> # right diagonal or not> rd> => [> 0> ]> *> 30> # Column array where its indices indicates column and> # used to check whether a queen can be placed in that> # row or not> cl> => [> 0> ]> *> 30> # A utility function to print solution> def> printSolution(board):> > for> i> in> range> (N):> > for> j> in> range> (N):> > print> (board[i][j], end> => ' '> )> > print> ()> # A recursive utility function to solve N> # Queen problem> def> solveNQUtil(board, col):> > # Base case: If all queens are placed> > # then return True> > if> (col>> => N):> > return> True> > # Consider this column and try placing> > # this queen in all rows one by one> > for> i> in> range> (N):> > # Check if the queen can be placed on board[i][col]> > # To check if a queen can be placed on> > # board[row][col] We just need to check> > # ld[row-col+n-1] and rd[row+coln]> > # where ld and rd are for left and> > # right diagonal respectively> > if> ((ld[i> -> col> +> N> -> 1> ] !> => 1> and> > rd[i> +> col] !> => 1> )> and> cl[i] !> => 1> ):> > # Place this queen in board[i][col]> > board[i][col]> => 1> > ld[i> -> col> +> N> -> 1> ]> => rd[i> +> col]> => cl[i]> => 1> > # Recur to place rest of the queens> > if> (solveNQUtil(board, col> +> 1> )):> > return> True> > # If placing queen in board[i][col]> > # doesn't lead to a solution,> > # then remove queen from board[i][col]> > board[i][col]> => 0> # BACKTRACK> > ld[i> -> col> +> N> -> 1> ]> => rd[i> +> col]> => cl[i]> => 0> > # If the queen cannot be placed in> > # any row in this column col then return False> > return> False> # This function solves the N Queen problem using> # Backtracking. It mainly uses solveNQUtil() to> # solve the problem. It returns False if queens> # cannot be placed, otherwise, return True and> # prints placement of queens in the form of 1s.> # Please note that there may be more than one> # solutions, this function prints one of the> # feasible solutions.> def> solveNQ():> > board> => [[> 0> ,> 0> ,> 0> ,> 0> ],> > [> 0> ,> 0> ,> 0> ,> 0> ],> > [> 0> ,> 0> ,> 0> ,> 0> ],> > [> 0> ,> 0> ,> 0> ,> 0> ]]> > if> (solveNQUtil(board,> 0> )> => => False> ):> > printf(> 'Solution does not exist'> )> > return> False> > printSolution(board)> > return> True> # Driver Code> if> __name__> => => '__main__'> :> > solveNQ()> # This code is contributed by SHUBHAMSINGH10> |
C#
// C# program to solve N Queen Problem using backtracking> using> System;> class> GFG {> > static> int> N = 4;> > // ld is an array where its indices indicate row-col+N-1> > // (N-1) is for shifting the difference to store> > // negative indices> > static> int> [] ld => new> int> [30];> > // rd is an array where its indices indicate row+col> > // and used to check whether a queen can be placed on> > // right diagonal or not> > static> int> [] rd => new> int> [30];> > // Column array where its indices indicates column and> > // used to check whether a queen can be placed in that> > // row or not> > static> int> [] cl => new> int> [30];> > // A utility function to print solution> > static> void> printSolution(> int> [, ] board)> > {> > for> (> int> i = 0; i for (int j = 0; j Console.Write(' {0} ', board[i, j]); Console.Write('
'); } } // A recursive utility function to solve N // Queen problem static bool solveNQUtil(int[, ] board, int col) { // Base case: If all queens are placed // then return true if (col>= N) повертає істину; // Розгляньте цей стовпець і спробуйте розмістити // цього ферзя в усіх рядках один за одним для (int i = 0; i // Перевірте, чи можна розмістити ферзя на // дошці[i,col] // Щоб перевірити, чи ферзя можна розмістити на // дошці [рядок, стовпець]. Нам просто потрібно перевірити // ld [рядок-стовпець+n-1] і rd [рядок+стовпець], де // ld і rd позначають лівий і правий / / діагональ відповідно if ((ld[i - col + N - 1] != 1 && rd[i + col] != 1) && cl[i] != 1) { // Розмістіть цього ферзя на дошці[i, col] board[i, col] = 1; ld[i - col + N - 1] = rd[i + col] = cl[i] = 1; // Розставити решту дам , col + 1)) return true; // Якщо розміщення ферзя на дошці [i, col] // не призводить до вирішення, тоді // видаліть ферзя з дошки [i, col] = 0; // BACKTRACK ld[i - col + N - 1] = rd[i + col] = cl[i] = 0; then return false return false; // Ця функція вирішує проблему N Queen, // здебільшого використовує solveNQUtil() для вирішення проблеми. Він повертає false, якщо ферзів // не можна поставити, інакше повертає true та // друкує розташування ферзів у формі 1s. // Зауважте, що може бути декілька // рішень, ця функція друкує одне з // можливих рішень. static bool solveNQ() { int[, ] board = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; if (solveNQUtil(board, 0) == false) { Console.Write('Рішення не існує'); повернути false; } printSolution(board); повернути істину; } // Код драйвера public static void Main(String[] args) { solveNQ(); } } // Цей код створено Rajput-Ji> |
Javascript
> > // JavaScript code to implement the approach> let N = 4;> > // ld is an array where its indices indicate row-col+N-1> // (N-1) is for shifting the difference to store negative> // indices> let ld => new> Array(30);> > // rd is an array where its indices indicate row+col> // and used to check whether a queen can be placed on> // right diagonal or not> let rd => new> Array(30);> > // Column array where its indices indicates column and> // used to check whether a queen can be placed in that> // row or not> let cl => new> Array(30);> > // A utility function to print solution> function> printSolution( board)> {> > for> (let i = 0; i { for (let j = 0; j document.write(board[i][j] + ' '); document.write(' '); } } // A recursive utility function to solve N // Queen problem function solveNQUtil(board, col) { // Base case: If all queens are placed // then return true if (col>= N) повертає істину; // Розгляньте цей стовпець і спробуйте розмістити // цього ферзя в усіх рядках один за одним для (нехай i = 0; i { // Перевірте, чи можна розмістити ферзя на // дошці [i][col] // Щоб перевірити чи можна розмістити ферзя // на дошці [рядок][стовпець]. Нам просто потрібно перевірити // ld[рядок-стовпець+n-1] і rd[рядок+стовпець], де // ld і rd позначають ліву сторону і справа // діагональ відповідно if ((ld[i - col + N - 1] != 1 && rd[i + col] != 1) && cl[i] != 1) { // Розмістіть цього ферзя на дошці [i][col] board[i][col] = 1; ld[i - col + N - 1] = rd[i + col] = cl[i] = 1; // Повторне розміщення ферзів if (solveNQUtil(board, col + 1)) return true; // Якщо розміщення ферзя на дошці[i][col] // не призводить до вирішення, тоді // видаліть ферзя з дошки[i][col] ] board[i][col] = 0; // BACKTRACK ld[i - col + N - 1] = rd[i + col] = cl[i] = 0; } } // Якщо ферзь не може бути розміщений будь-який рядок // у цьому стовпці повертає false return false; } // Ця функція вирішує проблему N Queen, // здебільшого використовує solveNQUtil() для вирішення проблеми. Він повертає false, якщо ферзів // не можна поставити, інакше повертає true та // друкує розташування ферзів у формі 1s. // Зауважте, що може бути декілька // рішень, ця функція друкує одне з // можливих рішень. функція solveNQ() { let board = [[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ]]; if (solveNQUtil(board, 0) == false) { document.write('Рішення не існує'); повернути false; } printSolution(board); повернути істину; } // Код драйвера solveNQ(); // Цей код створено sanjoy_62.> |
Вихід
. . Q . Q . . . . . . Q . Q . .
Часова складність: О (Н!)
Допоміжний простір: O(N)
Пов'язані статті:
- Друк усіх рішень у задачі N-Queen