How does backtracking work in solving the n queens problem?

  • Context: Java 
  • Thread starter Thread starter FallenApple
  • Start date Start date
Click For Summary
SUMMARY

The discussion focuses on the implementation of backtracking in solving the n queens problem, specifically addressing the need to unplace queens after recursive calls. Participants emphasize that a line of code to reset the board position, such as board[row][column] = false;, is essential for the algorithm to function correctly. The conversation highlights that without this reset, the algorithm fails to explore all potential solutions. The reference to Wirth's "Algorithms + Data Structures = Programs" provides foundational insight into recursive algorithms.

PREREQUISITES
  • Understanding of recursion and backtracking algorithms
  • Familiarity with the n queens problem and its constraints
  • Basic knowledge of programming concepts, particularly in languages like Python or Java
  • Experience with 2D array manipulation
NEXT STEPS
  • Implement the n queens problem using backtracking in Python
  • Study the role of recursion in algorithms by reviewing Wirth's "Algorithms + Data Structures = Programs"
  • Explore optimization techniques for backtracking algorithms
  • Learn about alternative algorithms for solving the n queens problem, such as constraint satisfaction problems
USEFUL FOR

Computer science students, software developers, and algorithm enthusiasts interested in understanding recursive problem-solving techniques and optimizing backtracking algorithms.

FallenApple
Messages
564
Reaction score
61
I'm watching a vid on the n queens problem. Basically I have find out how to put n queens on a chess board of size n without them attacking each other. It's a rather famous puzzle.

"The eight queens puzzle is the problem of placing eight chess queens on an 8×8 chessboard so that no two queens threaten each other. Thus, a solution requires that no two queens share the same row, column, or diagonal. The eight queens puzzle is an example of the more general n queens problem of placing n non-attacking queens on an n×n chessboard, for which solutions exist for all natural numbers n with the exception of n=2 and n=3."

https://en.wikipedia.org/wiki/Eight_queens_puzzle
Nqueen1.png


here there is no positions after the second level of the recursion. So it makes sense that after the third level of the recursion is popped from the stack, the second level will just continue the for loop.But why is the previous placement replaced?

Nqueen2.png


He mentions that when the backtrack happens, the queen is placed on the 4th column. But that is only possible if the previous placement is nullifed. But how? I see nothing in the code that can erase the result of board[2][3]==2.
 
Technology news on Phys.org
Even a youtube commenter got this:

Shouldn't there be a line to unplace a queen like this: board[row][column] = false; Otherwise, the queen will never be unplaced after the recursive call.

answer yes, there should be such a line, which should come after the if/else statement. You could only skip it if the board[][] array is a local variable which would be passed by value to NQueensBackTrack(). Adding and later removing the queensl should be faster.
 
willem2 said:
Even a youtube commenter got this:

Shouldn't there be a line to unplace a queen like this: board[row][column] = false; Otherwise, the queen will never be unplaced after the recursive call.

answer yes, there should be such a line, which should come after the if/else statement. You could only skip it if the board[][] array is a local variable which would be passed by value to NQueensBackTrack(). Adding and later removing the queensl should be faster.
So its right after the if else statement on the same level as it but not within it?
 
FallenApple said:
So its right after the if else statement on the same level as it but not within it?

It seems the progam continues after "Print board" to find other solutions, so you should remove the queen always, so the program can continue, so it should not be in the else block, but after the entire if-else
 
willem2 said:
It seems the progam continues after "Print board" to find other solutions, so you should remove the queen always, so the program can continue, so it should not be in the else block, but after the entire if-else

That makes sense. So the backtrack happens when the for loop finds nothing. If the for loop keeps finding something, eventually it will just hit print board, and never returns to the earlier call to reset the queen as removed.
 
For an explanation of this problem see Wirth, Algorithms + Data Structures = Programs (1976), Section 3.5. The whole of chapter 3 deals with recursive algorithms with great clarity.
 

Similar threads

  • · Replies 11 ·
Replies
11
Views
4K
  • · Replies 20 ·
Replies
20
Views
7K
Replies
1
Views
2K
  • · Replies 17 ·
Replies
17
Views
7K
Replies
5
Views
2K
  • · Replies 107 ·
4
Replies
107
Views
19K
  • · Replies 39 ·
2
Replies
39
Views
6K
  • · Replies 65 ·
3
Replies
65
Views
11K