版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37547376/article/details/82848596
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 = 1 或 n1 ≥ 4 时问题有解。
算法是逐行安排皇后的,其参数现在正执行到第几行。而这次的八皇后,n是皇后数自然是8。话不多说,贴上代码,提供大家参考
Module Module1
Const max = 8
Dim queen(max) As Integer
Dim sum = 0
Sub show() '输出每一种情况下棋盘中皇后的摆放情况
Dim i As Integer
Dim j As Integer
Dim s(8, 8) As Integer
For i = 0 To max - 1
s(i, queen(i)) = 2
System.Console.Write("(" & i & "," & queen(i) & ")")
Next i
System.Console.Write(vbCrLf)
For i = 0 To max - 1
For j = 0 To max - 1
System.Console.Write(s(i, j) & " ")
Next j
System.Console.Write(vbCrLf)
Next i
System.Console.Write(vbCrLf)
sum = sum + 1
End Sub
Function check(ByVal n) '检查当前列能否放置皇后
Dim i As Integer
For i = 0 To n - 1 '检查多个皇后在同一行/列/对角线的情况
If (queen(i) = queen(n)) Or (Math.Abs(queen(i) - queen(n)) = (Math.Abs(n - i))) Then
Return True
End If
Next i
Return False
End Function
Sub putQueen(ByVal n) ' 回溯尝试皇后位置,n为横坐标
Dim i As Integer
For i = 0 To max - 1
queen(n) = i
If ((Not check(n))) Then
If ((n = max - 1)) Then
show()
Else
putQueen(n + 1)
End If
End If
Next i
End Sub
Sub Main()
putQueen(0)
System.Console.WriteLine("符合要求的皇后位置有:" & sum & "种方法")
Console.ReadLine()
End Sub
End Module