任务是计算将 N 个皇后放在 NxN 板上的解决方案的数量。我试图考虑所有可能的情况来提高性能,但是在 N = 15 的情况下运行几乎需要 50 秒。这是我所做的:
Dim resultCount As Integer = 0
Dim fieldSize As Integer = 0
Dim queenCount As Integer = 0
Dim availableCols As Boolean()
Dim availableLeftDiagonal As Boolean()
Dim availableRightDiagonal As Boolean()
Private Sub butCalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butCalc.Click
Dim currentTime As Long = Now.Ticks
'Reset old result
resultCount = 0
fieldSize = CInt(txtFieldSize.Text)
queenCount = 0
ReDim availableCols(fieldSize - 1)
For i As Integer = 0 To fieldSize - 1
availableCols(i) = True
Next
ReDim availableLeftDiagonal((fieldSize - 1) * 2)
For i As Integer = 0 To (fieldSize - 1) * 2
availableLeftDiagonal(i) = True
Next
ReDim availableRightDiagonal((fieldSize - 1) * 2)
For i As Integer = 0 To (fieldSize - 1) * 2
availableRightDiagonal(i) = True
Next
'Calculate
For x As Integer = 0 To fieldSize - 1
putQueen(x, 0)
Next
'Print result
txtResult.Text = "Found " & resultCount & " in " & (Now.Ticks - currentTime) / 10000 & " miliseconds."
End Sub
Private Sub putQueen(ByVal pX As Integer, ByVal pY As Integer)
'Put in result
availableCols(pX) = False
availableLeftDiagonal(pX + pY) = False
availableRightDiagonal(pX - pY + (fieldSize - 1)) = False
queenCount += 1
'Recursion
If (queenCount = fieldSize) Then
resultCount += 1
Else
pY += 1 'pY = next row
For x As Integer = 0 To fieldSize - 1
If (availableCols(x) AndAlso
availableLeftDiagonal(x + pY) AndAlso
availableRightDiagonal(x - pY + (fieldSize - 1))) Then putQueen(x, pY)
Next
pY -= 1 'Reset pY
End If
'Roll up result
availableCols(pX) = True
availableLeftDiagonal(pX + pY) = True
availableRightDiagonal(pX - pY + (fieldSize - 1)) = True
queenCount -= 1
End Sub
请告诉我是否可能(我的老师没有给出确切的时间,他只是告诉“可接受的时间”。如果可能,请告诉我如何,或者只是给我一个线索!