vb.net 八皇后的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/qq_37547376/article/details/82848596