sp; ES(id) = ES(id) + 1: ES(11) = ES(11) - 1: ES(12) = ES(12) - 1 MoveVtiger = 0: GoTo Sort End If End Select Sort: If MoveVtiger = 0 Then SortEnd hnum + 2, 6 ''''竖放将领排序 SortEnd 11, 12 ''''空格排序 End If End Function
CHRDSave 保存已经走过的节点记录类
Option Explicit Dim SaveState(1 To 300000) As HRDState ''''最多走3万步 Public iCurrentNum As Long ''''当前位置的指针 Private Function IsExist(NewState() As Long, ilevel As Long) As Boolean IsExist = False Dim i As Long For i = iCurrentNum To 1 Step -1 If SaveState(i).Level < ilevel - 2 Then i = 0: Exit Function End If If SaveState(i).state(1) = NewState(1) And _ SaveState(i).state(2) = NewState(2) And _ SaveState(i).state(3) = NewState(3) And _ SaveState(i).state(4) = NewState(4) And _ SaveState(i).state(5) = NewState(5) And _ SaveState(i).state(6) = NewState(6) And _ SaveState(i).state(7) = NewState(7) And _ SaveState(i).state(8) = NewState(8) And _ SaveState(i).state(9) = NewState(9) And _ SaveState(i).state(10) = NewState(10) Then IsExist = True: i = 0: Exit Function End If Next i End Function Public Sub AddState(NewState() As Long, isuperid As Long, ilevel As Long) Dim i As Long If Not IsExist(NewState, ilevel) Then iCurrentNum = iCurrentNum + 1 For i = 1 To 12 SaveState(iCurrentNum).state(i) = NewState(i) Next SaveState(iCurrentNum).Superid = isuperid SaveState(iCurrentNum).Level = ilevel End If End Sub Private Sub Class_Initialize() iCurrentNum = 0 End Sub Public Function GetState(id As Long) If id > 0 Then G_State = SaveState(id) End If End Function
主界面窗体的代码
Private Sub ShowId(id As Long, deep As Long) Label1.Caption = "节点数:" & CStr(id) & " 测试深度:" & CStr(deep) End Sub Private Function isvalid(state() As Long, ByVal hnum As Long) Dim bs(1 To 20) As Integer Dim i As Integer Dim k As Integer ''''init For i = 1 To 20 bs(i) = 1 Next ''''check For i = 1 To 12 k = state(i) Select Case i Case 1 ''''曹操 bs(k) = 0 bs(k + 1) = 0 bs(k + 4) = 0 bs(k + 5) = 0 Case 2, 3, 4, 5, 6 If i <= hnum + 1 Then ''''横放的将军 bs(k) = 0 bs(k + 1) = 0 Else ''''竖放的将军 bs(k) = 0 bs(k + 4) = 0 End If Case 7, 8, 9, 10, 11, 12 ''''小卒和空格 bs(k) = 0 End Select Next i isvalid = True For i = 1 To 20 If bs(i) > 0 Then isvalid = False Exit Function End If Next i End Function Private Sub cmdStart_Click() Dim BEGINSTATE(1 To 12) As Long Dim i As Long Dim j As Long Dim k As Long Dim iHnum As Long Dim time1 As Date Dim time2 As Date Dim ifile As Integer ifile = FreeFile() time1 = Now() For i = 1 To 12 BEGINSTATE(i) = Int(Mid(TextBegin.Text, i * 2 - 1, 2)) Next i iHnum = CLng(txtNum.Text) If Not isvalid(BEGINSTATE, iHnum) Then MsgBox "初始状态不合法,请检查!" Exit Sub End If Set G_Next = New CHRDNext Set G_Save = New CHRDSave G_Save.AddState BEGINSTATE, 0, 0 ''''记录到最终的记录中去 i = 1 Do While i <= G_Save.iCurrentNum ''''堆栈尚未完成 ''''读入当前记录 G_Save.GetState i ShowId i, G_State.Level ''''判断是否可以结束循环 If G_State.state(1) = 14 Then G_Save.iCurrentNum = i Exit Do End If ''''计算所有下级步骤 G_Next.GetNext G_State.state, iHnum j = 1 Do While j <= G_Next.iEndNum  上一页 [1] [2] [3] [4] 下一页 没有相关教程
|