Re: [.NET] VB2008 8 Queen Problem的寫法

看板Visual_Basic作者 (阿年:))時間14年前 (2009/12/25 17:12), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
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
文章代碼(AID): #1BD87rPR (Visual_Basic)
文章代碼(AID): #1BD87rPR (Visual_Basic)