再谈八皇后问题
题目:
十九世纪著名的数学家高斯提出:在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□□□□□