[size=medium]我以前曾经用VB写了一个<<华容道解题程序1.0>>,当时限于水平,没有加上图形表示.
最近有点时间,想拿起来继续完善完善.
在生成一个新的状态以后,需要和现在已经有的状态进行比较,以判断是否是已经走过的状态,以确保不走回头路.
原来的代码是这样实现的.
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
由于这个比较本身就在一个循环里面,这种大面积比较还是比较费时间的,尽管这点时间现在看来已经很微不足道了.
要提高效率,就得在提高比较速度上下工夫.
晚上我忽然想到,如果把每个状态能够算出一个特征值出来,一样的状态特征值是一样的;而不一样的状态特征值相同的概率也不会太大.这样一来每次只要比较一个特征值就可以了,如果特征值相同,再进行状态的细致比较.
于是乎定义了这样一个特征值函数.
Private Function GetCheckFlag(state() As Long)
Dim i As Long
Dim iFlag As Long
GetCheckFlag = 0: iFlag = 0
For i = 1 To 10
iFlag = iFlag + state(i) * state(i)
Next i
GetCheckFlag = iFlag
End Function
把12个状态值简单的计算了一下平方和.这样就得到一个特征值.
修改以后的比较函数如下:
'先比较校验码,校验码不同,就不必进行下面的比较了。
If SaveState(i).checkFlag <> iFlag Then
GoTo looppos
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
通过这种方式,终于提高了速度,初步测算,整体的计算速度提高了5到6倍.
另外终于加上了绘图功能,欢迎下载查看.[/size]