再谈八皇后问题

题目:

十九世纪著名的数学家高斯提出:在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□□□□□

你可能感兴趣的:(Blog,J#)