• 再谈八皇后问题


    题目:

    十九世纪著名的数学家高斯提出:在8×8格的国际象棋棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。


    分析:

    其实问题可以转化为12345678的满足某种条件(行已不等,列亦不等,只需设定其不在同一斜线上,即斜率不为 1 或-1 )的排列.

    通过前两天用非递归方式解决序列的全排列问题(.http://blog.csdn.net/northwolves/archive/2004/07/21/47601.aspx),在较短的时间内写出如下代码,经测试速度还可以:

    代码:

    'add a textbox (with multiline=true and scrollbars=2 vertical),and a commandbutton


    Private Sub queens8(ByRef result() As String) '计算八皇后问题的过程
    Dim i As Long, J As Integer, k As Integer '循环变量
    Dim FIT As Boolean '判定是否符合条件
    Dim ALL(1 To 8), out(1 To 8) As String '用于输出的数组
    Dim TEMP1 As Long, TEMP2 As Integer '进制转换中间变量
    For i = 1 To 40320 ' 穷举8!种排列
    ALL(1) = 1
    TEMP1 = i
    For J = 2 To 8
    TEMP2 = TEMP1 Mod J '混合进制
    TEMP1 = TEMP1 / J
    If TEMP2 = 0 Then
    ALL(J) = J 'temp2为 0则放在最后
    Else
    For k = J To TEMP2 + 1 Step -1
    ALL(k) = ALL(k - 1) ' temp2之后的元素后移一位
    Next
    ALL(TEMP2) = J 'temp2不为 0 则置于第temp2个元素前
    End If
    Next '至此得到12345678的一个排列

    FIT = True '初始化变量

    '循环判断有否两个皇后存在互吃
    For J = 1 To 8
    For k = 8 To 1 Step -1
    If Not k = J Then
    If Abs((ALL(k) - ALL(J))) = Abs(J - k) Then
    FIT = False
    GoTo pass '跳出循环
    End If
    End If
    Next
    Next

    If FIT Then '满足条件时
    Num = Num + 1 '输出编号
    ReDim Preserve result(1 To Num)
    For J = 1 To 8
    out(J) = String(8, StrConv("□", vbWide))
    Mid(out(J), ALL(J), 1) = StrConv("Q", vbWide)
    Next
    result(Num) = "第" & Num & "种方法:" & vbCrLf & Join(out, vbCrLf) '输出第 num 种 8个皇后摆放状态
    End If
    pass:
    Next
    End Sub

    Private Sub Command1_Click()
    Dim result() As String
    Text1.Text = ""
    queens8 result
    Text1.Text = Join(result, vbCrLf & vbCrLf)
    End Sub

    输出:

    第1种方法:
    □□□□Q□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□□□Q□□
    □□Q□□□□□
    Q□□□□□□□
    □□□Q□□□□
    □□□□□□□Q

    第2种方法:
    □□□Q□□□□
    □□□□□□Q□
    □□□□Q□□□
    □Q□□□□□□
    □□□□□Q□□
    Q□□□□□□□
    □□Q□□□□□
    □□□□□□□Q

    第3种方法:
    □□□□□Q□□
    □□□Q□□□□
    □□□□□□Q□
    Q□□□□□□□
    □□Q□□□□□
    □□□□Q□□□
    □Q□□□□□□
    □□□□□□□Q

    第4种方法:
    □□□□□Q□□
    □□Q□□□□□
    □□□□Q□□□
    □□□□□□Q□
    Q□□□□□□□
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□□Q

    第5种方法:
    □□□□□□□Q
    □Q□□□□□□
    □□□Q□□□□
    Q□□□□□□□
    □□□□□□Q□
    □□□□Q□□□
    □□Q□□□□□
    □□□□□Q□□

    第6种方法:
    □□□□□□□Q
    □Q□□□□□□
    □□□□Q□□□
    □□Q□□□□□
    Q□□□□□□□
    □□□□□□Q□
    □□□Q□□□□
    □□□□□Q□□

    第7种方法:
    □□□□□□□Q
    □□Q□□□□□
    Q□□□□□□□
    □□□□□Q□□
    □Q□□□□□□
    □□□□Q□□□
    □□□□□□Q□
    □□□Q□□□□

    第8种方法:
    □□□□□□□Q
    □□□Q□□□□
    Q□□□□□□□
    □□Q□□□□□
    □□□□□Q□□
    □Q□□□□□□
    □□□□□□Q□
    □□□□Q□□□

    第9种方法:
    □□□□Q□□□
    □□□□□□□Q
    □□□Q□□□□
    Q□□□□□□□
    □□Q□□□□□
    □□□□□Q□□
    □Q□□□□□□
    □□□□□□Q□

    第10种方法:
    □□Q□□□□□
    □□□□□□□Q
    □□□Q□□□□
    □□□□□□Q□
    Q□□□□□□□
    □□□□□Q□□
    □Q□□□□□□
    □□□□Q□□□

    第11种方法:
    □□□□Q□□□
    □□□□□□□Q
    □□□Q□□□□
    Q□□□□□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□□□Q□□
    □□Q□□□□□

    第12种方法:
    □□□Q□□□□
    □□□□□□□Q
    Q□□□□□□□
    □□□□Q□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□□□Q□□
    □□Q□□□□□

    第13种方法:
    □□□Q□□□□
    □□□□□□□Q
    □□□□Q□□□
    □□Q□□□□□
    Q□□□□□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□□□Q□□

    第14种方法:
    □□□□□Q□□
    □□□□□□□Q
    □Q□□□□□□
    □□□Q□□□□
    Q□□□□□□□
    □□□□□□Q□
    □□□□Q□□□
    □□Q□□□□□

    第15种方法:
    □Q□□□□□□
    □□□□□□□Q
    □□□□□Q□□
    Q□□□□□□□
    □□Q□□□□□
    □□□□Q□□□
    □□□□□□Q□
    □□□Q□□□□

    第16种方法:
    □□□Q□□□□
    □□□□□□□Q
    Q□□□□□□□
    □□Q□□□□□
    □□□□□Q□□
    □Q□□□□□□
    □□□□□□Q□
    □□□□Q□□□

    第17种方法:
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□□Q
    □□□□□Q□□
    Q□□□□□□□
    □□Q□□□□□
    □□□□Q□□□
    □□□□□□Q□

    第18种方法:
    □□□□□□Q□
    □□Q□□□□□
    □□□□□□□Q
    □Q□□□□□□
    □□□□Q□□□
    Q□□□□□□□
    □□□□□Q□□
    □□□Q□□□□

    第19种方法:
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□□Q
    □□□□Q□□□
    □□□□□□Q□
    Q□□□□□□□
    □□Q□□□□□
    □□□□□Q□□

    第20种方法:
    □□□Q□□□□
    □□□□□Q□□
    □□□□□□□Q
    □Q□□□□□□
    □□□□□□Q□
    Q□□□□□□□
    □□Q□□□□□
    □□□□Q□□□

    第21种方法:
    Q□□□□□□□
    □□□□□Q□□
    □□□□□□□Q
    □□Q□□□□□
    □□□□□□Q□
    □□□Q□□□□
    □Q□□□□□□
    □□□□Q□□□

    第22种方法:
    □□□□Q□□□
    □□Q□□□□□
    □□□□□□□Q
    □□□Q□□□□
    □□□□□□Q□
    Q□□□□□□□
    □□□□□Q□□
    □Q□□□□□□

    第23种方法:
    □□□□Q□□□
    Q□□□□□□□
    □□□□□□□Q
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□Q□
    □□Q□□□□□
    □□□□□Q□□

    第24种方法:
    □□□□Q□□□
    □Q□□□□□□
    □□□□□□□Q
    Q□□□□□□□
    □□□Q□□□□
    □□□□□□Q□
    □□Q□□□□□
    □□□□□Q□□

    第25种方法:
    □□Q□□□□□
    □□□□Q□□□
    □□□□□□□Q
    □□□Q□□□□
    Q□□□□□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□□□Q□□

    第26种方法:
    □□Q□□□□□
    □□□□□Q□□
    □□□□□□□Q
    Q□□□□□□□
    □□□□Q□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□Q□□□□

    第27种方法:
    □□□Q□□□□
    □□□□□Q□□
    □□□□□□□Q
    □□Q□□□□□
    Q□□□□□□□
    □□□□□□Q□
    □□□□Q□□□
    □Q□□□□□□

    第28种方法:
    □□Q□□□□□
    □□□□□Q□□
    □□□□□□□Q
    Q□□□□□□□
    □□□Q□□□□
    □□□□□□Q□
    □□□□Q□□□
    □Q□□□□□□

    第29种方法:
    □□□□Q□□□
    Q□□□□□□□
    □□□□□□□Q
    □□□□□Q□□
    □□Q□□□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□Q□□□□

    第30种方法:
    Q□□□□□□□
    □□□□Q□□□
    □□□□□□□Q
    □□□□□Q□□
    □□Q□□□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□Q□□□□

    第31种方法:
    □Q□□□□□□
    □□□□□Q□□
    □□□□□□□Q
    □□Q□□□□□
    Q□□□□□□□
    □□□Q□□□□
    □□□□□□Q□
    □□□□Q□□□

    第32种方法:
    □□Q□□□□□
    □□□□□Q□□
    □□□□□□□Q
    □Q□□□□□□
    □□□Q□□□□
    Q□□□□□□□
    □□□□□□Q□
    □□□□Q□□□

    第33种方法:
    □□□□□Q□□
    □□Q□□□□□
    □□□□Q□□□
    □□□□□□□Q
    Q□□□□□□□
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□Q□

    第34种方法:
    □□□□□Q□□
    □□Q□□□□□
    Q□□□□□□□
    □□□□□□□Q
    □□□□Q□□□
    □Q□□□□□□
    □□□Q□□□□
    □□□□□□Q□

    第35种方法:
    □□□Q□□□□
    □Q□□□□□□
    □□□□Q□□□
    □□□□□□□Q
    □□□□□Q□□
    Q□□□□□□□
    □□Q□□□□□
    □□□□□□Q□

    第36种方法:
    □□□□□□Q□
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□□Q
    □□□□□Q□□
    Q□□□□□□□
    □□Q□□□□□
    □□□□Q□□□

    第37种方法:
    □□□□□□Q□
    Q□□□□□□□
    □□Q□□□□□
    □□□□□□□Q
    □□□□□Q□□
    □□□Q□□□□
    □Q□□□□□□
    □□□□Q□□□

    第38种方法:
    □□Q□□□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□□□□□Q
    □□□□Q□□□
    Q□□□□□□□
    □□□Q□□□□
    □□□□□Q□□

    第39种方法:
    □□□Q□□□□
    □□□□□□Q□
    □□Q□□□□□
    □□□□□□□Q
    □Q□□□□□□
    □□□□Q□□□
    Q□□□□□□□
    □□□□□Q□□

    第40种方法:
    □□Q□□□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□□□□□Q
    □□□□□Q□□
    □□□Q□□□□
    Q□□□□□□□
    □□□□Q□□□

    第41种方法:
    Q□□□□□□□
    □□□□□□Q□
    □□□□Q□□□
    □□□□□□□Q
    □Q□□□□□□
    □□□Q□□□□
    □□□□□Q□□
    □□Q□□□□□

    第42种方法:
    □Q□□□□□□
    □□□□□□Q□
    □□□□Q□□□
    □□□□□□□Q
    Q□□□□□□□
    □□□Q□□□□
    □□□□□Q□□
    □□Q□□□□□

    第43种方法:
    □□□Q□□□□
    □□□□□□Q□
    Q□□□□□□□
    □□□□□□□Q
    □□□□Q□□□
    □Q□□□□□□
    □□□□□Q□□
    □□Q□□□□□

    第44种方法:
    □□Q□□□□□
    □□□□Q□□□
    □Q□□□□□□
    □□□□□□□Q
    Q□□□□□□□
    □□□□□□Q□
    □□□Q□□□□
    □□□□□Q□□

    第45种方法:
    □□□Q□□□□
    Q□□□□□□□
    □□□□Q□□□
    □□□□□□□Q
    □Q□□□□□□
    □□□□□□Q□
    □□Q□□□□□
    □□□□□Q□□

    第46种方法:
    □□□□□Q□□
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□□Q
    □□□□Q□□□
    □□□□□□Q□
    Q□□□□□□□
    □□Q□□□□□

    第47种方法:
    □□□□□Q□□
    □□Q□□□□□
    Q□□□□□□□
    □□□□□□□Q
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□Q□
    □□□□Q□□□

    第48种方法:
    □Q□□□□□□
    □□□Q□□□□
    □□□□□Q□□
    □□□□□□□Q
    □□Q□□□□□
    Q□□□□□□□
    □□□□□□Q□
    □□□□Q□□□

    第49种方法:
    □□Q□□□□□
    □□□□Q□□□
    □Q□□□□□□
    □□□□□□□Q
    □□□□□Q□□
    □□□Q□□□□
    □□□□□□Q□
    Q□□□□□□□

    第50种方法:
    □□□Q□□□□
    Q□□□□□□□
    □□□□Q□□□
    □□□□□□□Q
    □□□□□Q□□
    □□Q□□□□□
    □□□□□□Q□
    □Q□□□□□□

    第51种方法:
    □□□□Q□□□
    □□Q□□□□□
    Q□□□□□□□
    □□□□□Q□□
    □□□□□□□Q
    □Q□□□□□□
    □□□Q□□□□
    □□□□□□Q□

    第52种方法:
    □□□□Q□□□
    □Q□□□□□□
    □□□Q□□□□
    □□□□□Q□□
    □□□□□□□Q
    □□Q□□□□□
    Q□□□□□□□
    □□□□□□Q□

    第53种方法:
    □□□□□□Q□
    □□□Q□□□□
    □Q□□□□□□
    □□□□Q□□□
    □□□□□□□Q
    Q□□□□□□□
    □□Q□□□□□
    □□□□□Q□□

    第54种方法:
    □□□□□□Q□
    □Q□□□□□□
    □□□Q□□□□
    Q□□□□□□□
    □□□□□□□Q
    □□□□Q□□□
    □□Q□□□□□
    □□□□□Q□□

    第55种方法:
    □□□□□□Q□
    □□Q□□□□□
    Q□□□□□□□
    □□□□□Q□□
    □□□□□□□Q
    □□□□Q□□□
    □Q□□□□□□
    □□□Q□□□□

    第56种方法:
    □□□□Q□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□Q□□□□
    □□□□□□□Q
    Q□□□□□□□
    □□Q□□□□□
    □□□□□Q□□

    第57种方法:
    □Q□□□□□□
    □□□□□□Q□
    □□Q□□□□□
    □□□□□Q□□
    □□□□□□□Q
    □□□□Q□□□
    Q□□□□□□□
    □□□Q□□□□

    第58种方法:
    Q□□□□□□□
    □□□□□□Q□
    □□□Q□□□□
    □□□□□Q□□
    □□□□□□□Q
    □Q□□□□□□
    □□□□Q□□□
    □□Q□□□□□

    第59种方法:
    □□□□Q□□□
    □□□□□□Q□
    Q□□□□□□□
    □□Q□□□□□
    □□□□□□□Q
    □□□□□Q□□
    □□□Q□□□□
    □Q□□□□□□

    第60种方法:
    □□Q□□□□□
    Q□□□□□□□
    □□□□□□Q□
    □□□□Q□□□
    □□□□□□□Q
    □Q□□□□□□
    □□□Q□□□□
    □□□□□Q□□

    第61种方法:
    □□□□□Q□□
    □□Q□□□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□□□□□Q
    □□□□Q□□□
    Q□□□□□□□
    □□□Q□□□□

    第62种方法:
    □□□□□Q□□
    □□□Q□□□□
    □□□□□□Q□
    Q□□□□□□□
    □□□□□□□Q
    □Q□□□□□□
    □□□□Q□□□
    □□Q□□□□□

    第63种方法:
    □□□□□Q□□
    Q□□□□□□□
    □□□□Q□□□
    □Q□□□□□□
    □□□□□□□Q
    □□Q□□□□□
    □□□□□□Q□
    □□□Q□□□□

    第64种方法:
    □□□□□Q□□
    □□□Q□□□□
    Q□□□□□□□
    □□□□Q□□□
    □□□□□□□Q
    □Q□□□□□□
    □□□□□□Q□
    □□Q□□□□□

    第65种方法:
    □□Q□□□□□
    □□□□□Q□□
    □Q□□□□□□
    □□□□Q□□□
    □□□□□□□Q
    Q□□□□□□□
    □□□□□□Q□
    □□□Q□□□□

    第66种方法:
    □□Q□□□□□
    □□□□□Q□□
    □□□Q□□□□
    Q□□□□□□□
    □□□□□□□Q
    □□□□Q□□□
    □□□□□□Q□
    □Q□□□□□□

    第67种方法:
    □□Q□□□□□
    □□□□□Q□□
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□□Q
    □□□□Q□□□
    □□□□□□Q□
    Q□□□□□□□

    第68种方法:
    □□□□Q□□□
    Q□□□□□□□
    □□□Q□□□□
    □□□□□Q□□
    □□□□□□□Q
    □Q□□□□□□
    □□□□□□Q□
    □□Q□□□□□

    第69种方法:
    □□□Q□□□□
    □□□□□Q□□
    Q□□□□□□□
    □□□□Q□□□
    □Q□□□□□□
    □□□□□□□Q
    □□Q□□□□□
    □□□□□□Q□

    第70种方法:
    □□□□□□Q□
    □□□□Q□□□
    □□Q□□□□□
    Q□□□□□□□
    □□□□□Q□□
    □□□□□□□Q
    □Q□□□□□□
    □□□Q□□□□

    第71种方法:
    □□□□Q□□□
    □□□□□□Q□
    □□□Q□□□□
    Q□□□□□□□
    □□Q□□□□□
    □□□□□□□Q
    □□□□□Q□□
    □Q□□□□□□

    第72种方法:
    □□□□Q□□□
    □□□□□□Q□
    Q□□□□□□□
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□□Q
    □□□□□Q□□
    □□Q□□□□□

    第73种方法:
    □□□□□Q□□
    □□Q□□□□□
    □□□□□□Q□
    □□□Q□□□□
    Q□□□□□□□
    □□□□□□□Q
    □Q□□□□□□
    □□□□Q□□□

    第74种方法:
    □□□□□Q□□
    □□Q□□□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□Q□□□□
    □□□□□□□Q
    Q□□□□□□□
    □□□□Q□□□

    第75种方法:
    □□□□□Q□□
    □Q□□□□□□
    □□□□□□Q□
    Q□□□□□□□
    □□□Q□□□□
    □□□□□□□Q
    □□□□Q□□□
    □□Q□□□□□

    第76种方法:
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□Q□
    □□Q□□□□□
    □□□□□Q□□
    □□□□□□□Q
    Q□□□□□□□
    □□□□Q□□□

    第77种方法:
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□Q□
    □□Q□□□□□
    □□□□□Q□□
    □□□□□□□Q
    □□□□Q□□□
    Q□□□□□□□

    第78种方法:
    □Q□□□□□□
    □□□□Q□□□
    □□□□□□Q□
    Q□□□□□□□
    □□Q□□□□□
    □□□□□□□Q
    □□□□□Q□□
    □□□Q□□□□

    第79种方法:
    □Q□□□□□□
    □□□□Q□□□
    □□□□□□Q□
    □□□Q□□□□
    Q□□□□□□□
    □□□□□□□Q
    □□□□□Q□□
    □□Q□□□□□

    第80种方法:
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□Q□
    □□□□Q□□□
    Q□□□□□□□
    □□□□□□□Q
    □□□□□Q□□
    □□Q□□□□□

    第81种方法:
    □□□□□Q□□
    □□Q□□□□□
    Q□□□□□□□
    □□□□□□Q□
    □□□□Q□□□
    □□□□□□□Q
    □Q□□□□□□
    □□□Q□□□□

    第82种方法:
    □Q□□□□□□
    □□□□□Q□□
    Q□□□□□□□
    □□□□□□Q□
    □□□Q□□□□
    □□□□□□□Q
    □□Q□□□□□
    □□□□Q□□□

    第83种方法:
    □□□□Q□□□
    □□Q□□□□□
    Q□□□□□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□□□□□Q
    □□□□□Q□□
    □□□Q□□□□

    第84种方法:
    □□□□Q□□□
    □Q□□□□□□
    □□□Q□□□□
    □□□□□□Q□
    □□Q□□□□□
    □□□□□□□Q
    □□□□□Q□□
    Q□□□□□□□

    第85种方法:
    □□□□□□Q□
    □Q□□□□□□
    □□□□□Q□□
    □□Q□□□□□
    Q□□□□□□□
    □□□Q□□□□
    □□□□□□□Q
    □□□□Q□□□

    第86种方法:
    □□□□Q□□□
    □□□□□□Q□
    □Q□□□□□□
    □□□□□Q□□
    □□Q□□□□□
    Q□□□□□□□
    □□□□□□□Q
    □□□Q□□□□

    第87种方法:
    □□□Q□□□□
    □□□□□□Q□
    □□□□Q□□□
    □□Q□□□□□
    Q□□□□□□□
    □□□□□Q□□
    □□□□□□□Q
    □Q□□□□□□

    第88种方法:
    □□Q□□□□□
    □□□□Q□□□
    □□□□□□Q□
    Q□□□□□□□
    □□□Q□□□□
    □Q□□□□□□
    □□□□□□□Q
    □□□□□Q□□

    第89种方法:
    □□□□□Q□□
    □Q□□□□□□
    □□□□□□Q□
    Q□□□□□□□
    □□Q□□□□□
    □□□□Q□□□
    □□□□□□□Q
    □□□Q□□□□

    第90种方法:
    □□Q□□□□□
    □□□□□Q□□
    □Q□□□□□□
    □□□□□□Q□
    Q□□□□□□□
    □□□Q□□□□
    □□□□□□□Q
    □□□□Q□□□

    第91种方法:
    □□Q□□□□□
    □□□□□Q□□
    □Q□□□□□□
    □□□□□□Q□
    □□□□Q□□□
    Q□□□□□□□
    □□□□□□□Q
    □□□Q□□□□

    第92种方法:
    □□□□Q□□□
    □Q□□□□□□
    □□□□□Q□□
    Q□□□□□□□
    □□□□□□Q□
    □□□Q□□□□
    □□□□□□□Q
    □□Q□□□□□

  • 相关阅读:
    C# 6.0
    C# 4.0
    C# 5.0
    C# 3.0
    C# 2.0
    C# 1.0(2002)
    字典树Trie
    Hadoop——生态体系
    程序是怎样跑起来的
    Redis实战(十七)Redis各个版本新特性
  • 原文地址:https://www.cnblogs.com/fengju/p/6336389.html
Copyright © 2020-2023  润新知