不太懂vb,帮忙看下成语接龙的程序,或一起讨论以下成语接龙的算法(100分)

Even713 2007-10-26 10:31:28
我这里有40000多词库成语,想利用sqlserver来编写成语接龙,让这条龙很长,网上好象有能接到5000多个词的龙了.
下面有一个vb编写的程序,不过看不懂,似乎蛮经典的,有人能解释吗?或者提一些你们关于成语接龙的想法.能提供思路的一定给分,谢谢了!

'stack类模块代码:

Option Compare Database
Option Explicit
Dim StackColl As New Collection

Public Property Get Count() As Variant
Count = StackColl.Count
End Property

Public Sub Push(Var As Variant)
StackColl.Add (Var)
End Sub

Public Function fetch() As Variant
fetch = StackColl.Item(StackColl.Count)
StackColl.Remove (StackColl.Count)
End Function

Public Property Get AllString() As Variant
Dim strItem As Variant
For Each strItem In StackColl
AllString = AllString & "'" & strItem & "',"
Next
End Property

'Form_接龙模块代码:

Option Compare Database
Option Explicit

Private Sub 命令0_Click()
Me.显示接龙 = GetLink(Me.选择成语, Me.接龙长度)
End Sub

Public Function GetLink(StartWord As String, Lenth As Integer) As String
Dim MaxLen As Integer, i As Integer
Dim objStackA As New stack
Dim objStackB As New stack
Dim EndWord As String
Dim rst As Recordset
Randomize
objStackB.Push StartWord
Do While MaxLen < Lenth And objStackB.Count > 0
StartWord = objStackB.fetch
Set rst = CurrentDb().OpenRecordset("Select CM from cy where Head='" & Right(StartWord, 1) & "' AND CM Not In (''," & objStackA.AllString & ")" & IIf(Int(2 * Rnd) = 0, "", " Order by CM Desc"))
If Not rst.EOF Then
Do While objStackA.Count > 0
EndWord = objStackA.fetch
If Right(EndWord, 1) = Left(StartWord, 1) Then
objStackA.Push EndWord
Exit Do
End If
Loop
objStackA.Push StartWord
If objStackA.Count > MaxLen Then
GetLink = objStackA.AllString
MaxLen = objStackA.Count
End If
Do While Not rst.EOF
objStackB.Push rst![CM]
rst.MoveNext
Loop
End If
Loop
End Function
...全文
288 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Even713 2007-11-01
  • 打赏
  • 举报
回复
就是一个递归
一直循环
直到达到你要求的成语数 或者 未达到要求的数量但查询完毕 后返回
-----------------------------------------
这样简单的做是达不到比较长的龙的,一般一百多个成语,但是该vb程序可以达到len=2000个龙.我觉得这个不一般的,有一定的算法在里面,而且他在生成上百个成语时速度也理想.

其实就是希望大家能讨论一下算法,我觉得达到最优的,最长的龙可能不现实,不知道有什么算法能逼近这样的龙呢?
Even713 2007-11-01
  • 打赏
  • 举报
回复
谢谢楼上的.
我现在做成了一个,蛮长的了.
http://topic.csdn.net/u/20071031/16/986e63a4-f1cd-4927-94d1-c5dbab3c8650.html
大家看看,继续讨论一下算法吧.我的算法一定不是最优的.
  • 打赏
  • 举报
回复
我只是描述下 你贴的代码的思路
  • 打赏
  • 举报
回复
就是一个递归
一直循环
直到达到你要求的成语数 或者 未达到要求的数量但查询完毕 后返回

至于优化
写成SQL过程或者函数其实效率上差别不大
应该从算法上去改进

Even713 2007-10-31
  • 打赏
  • 举报
回复
谢谢 vansoft
objStackA和objStackB分别存储什么的?
If objStackA.Count > MaxLen Then
GetLink = objStackA.AllString
MaxLen = objStackA.Count
End If
又是在做什么方面的比较呢?
vansoft 2007-10-31
  • 打赏
  • 举报
回复
你贴的代码用了集合+数据库
vansoft 2007-10-31
  • 打赏
  • 举报
回复
不停的循环而已,

先取一个词,
然后就是这个词的尾字做查询,
一直到查不到为止。

用递归就行了。
Even713 2007-10-29
  • 打赏
  • 举报
回复
我在sql那里也开了个贴的,楼上的可以参见http://topic.csdn.net/u/20071026/22/2bfcec7a-5133-4654-9e6c-88e11cbf04d3.html
应该说简单的算法很容易想到,但是最简单的算法是不现实的.因为需要太久了,否则我也不会贴上来,我想理解上面vb的算法,然后写成sql版,多谢了!
Even713 2007-10-29
  • 打赏
  • 举报
回复
怎么没有人回答呢,至少懂vb的人应该能看懂这个程序吧?顶者有分!请多多帮忙!
tantaiyizu 2007-10-28
  • 打赏
  • 举报
回复

哈 ,不明白你是要自己写? 还是将这个继续呢?

可以都放在一个表里啦

然后去数据库查询首字和末尾字匹配就ok了

偶觉得还好了,不是很难了
Even713 2007-10-28
  • 打赏
  • 举报
回复
没有人吗?提一些自己的想法也行啊,请高手不吝赐教啊!

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧