Eight Queens Problem using VB.NET






4.26/5 (33 votes)
Backtracking solution approach to solve the eight queens problems and get all unique solutions
Introduction
The Eight Queens Problem is a famous problem in AI field and a famous example about AI algorithms used to solve such a problem using backtracking method.
Background
The solution shows all unique solutions to the eight queens problem which are exactly 92 solutions, 12 of which are distinct. The application also allows you to play the game yourself and try to find your own solution. The algorithm uses backtracking and depth first limited search to level 8 (8 queens) to find a solution.
Using the Code
The Queen
class is the basic object used in the algorithm and all over the project for graphics display too. It's fairly simple:
Public Class Queen
Private mRow As Integer
Private mColumn As Integer
Public Sub New()
mRow = 0
mColumn = 0
End Sub
Public Sub New(ByVal Row As Byte, ByVal Column As Byte)
mRow = Row
mColumn = Column
End Sub
Public Property Row() As Integer
Get
Return mRow
End Get
Set(ByVal value As Integer)
mRow = value
End Set
End Property
Public Property Column() As Integer
Get
Return mColumn
End Get
Set(ByVal value As Integer)
mColumn = value
End Set
End Property
End Class
The ChessBoard
user control draws the board and is actually where the algorithm of finding all solutions takes place. The function of interest is the MoveQueen
function which moves a queen across the board, then checks if the new position is a good place or that the queen is attacked. The process is repeated recursively until all 8 queens are placed in a safe place.
Private Sub MoveQueen(ByVal Level As Integer)
If Level > 7 Then
For j As Integer = 0 To 7
For i As Integer = 0 To 7
If (Queens(j).Row = j) And (Queens(j).Column = i) Then
mCells(i, j) = True
Else
mCells(i, j) = False
End If
Next
Next
Solutions.Add(mCells.Clone)
Exit Sub
End If
For j As Integer = 0 To 7
If Level < 8 Then
Queens(Level).Row = Level
Queens(Level).Column = j
If CheckAll(Level) Then MoveQueen(Level + 1)
End If
Next
End Sub
Finally, a call to GetSolutions
will initiate the MoveQueen
function starting from the first level, which is the depth of the current position in the depth tree. Reaching a level of 8 means we have found a solution. Otherwise, 1 level is decremented to the previous level and the search continues using different values. This process is called Backtracking.
Public Sub GetSolutions()
mUserPlay = False
Playing = False
Queens.Clear()
ResetCells()
DrawBoard()
For j As Integer = 0 To 7
Queens.Add(New Queen)
Next
For i As Integer = 0 To 7
Queens(0).Row = 0
Queens(0).Column = i
MoveQueen(1)
Next
End Sub
Points of Interest
What's interesting here is that the solutions are ordered according to the board from top-left to bottom-right so you can have all solutions by repeating click on solve button.
History
- 4th January, 2009: Initial post