Re: [.NET] VB2008 8 Queen Problem的寫法
Public Class Form1
Dim chess_board(8, 8) As Boolean
Function safe(ByVal chess_board(,) As Boolean, ByVal x As Integer, ByVal y As Integer) As Boolean
Dim is_safe As Boolean
Dim i, x2, y2, x3, y3, dp As Integer
is_safe = True
For i = 1 To 8
If chess_board(x, i) Then
is_safe = False
ElseIf chess_board(i, y) Then
is_safe = False
End If
Next
For dp = -7 To 7
x2 = x + dp
y2 = y + dp
If x2 >= 1 And x2 <= 8 Then
If y2 >= 1 And y2 <= 8 Then
If chess_board(x2, y2) Then
is_safe = False
End If
End If
End If
Next
For dq = -7 To 7
x3 = x + dq
y3 = y - dq
If x3 >= 1 And x3 <= 8 Then
If y3 >= 1 And y3 <= 8 Then
If chess_board(x3, y3) Then
is_safe = False
End If
End If
End If
Next
Return is_safe
End Function
Sub draw_chess_board(ByVal board)
Dim g = Me.CreateGraphics()
Dim i As Integer
For i = 1 To 9
g.DrawLine(Pens.Black, i * 15, 15, i * 15, 135)
g.DrawLine(Pens.Black, 15, i * 15, 135, i * 15)
Next
For row = 1 To 8
For j = 1 To 8
If board(row, j) Then
g.DrawEllipse(Pens.Red, row * 15 + 4, j * 15 + 4, 7, 7)
End If
Next
Next
g.Dispose()
End Sub
Sub PlaceAQueen(ByVal board(,) As Boolean, ByVal row As Integer)
For row = 1 To 8
For j = 1 To 8
If (safe(chess_board, row, j) = True) Then
chess_board(row, j) = True
If (chess_board(8, j) = True) Then
draw_chess_board(board)
MsgBox("我找到一組解了,厲害吧!:)")
Else
PlaceAQueen(chess_board, row + 1)
End If
chess_board(row, j) = False
End If
Next
Next
draw_chess_board(board)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
PlaceAQueen(chess_board, 1)
End Sub
End Class
我有改過,
現在可以執行了,
可是跑出來的答案不對,
在第五行會有兩個Queen,
而且我按下MsgBox跳出的”確定”後,
它出來的第二組解似乎不會完全蓋過原來的解,
所以棋盤上的Queen就越來越多= =
麻煩好心的大大幫我找一下bug!(鞠躬
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 120.127.32.231
討論串 (同標題文章)