20个小孩围成一圈,先从某个小孩开始编号为1到20(编号在整个游戏中不变),按顺时针方向开始报数,每数到8则该小孩退出圈子,又从下一个小子开始报数,……。
这个问题就是Josephus问题的简单描述,以往看到的很多例子都是用C语言实现的,可能是因为VB中没有现成的指针的原因。我们就用构造类的方法来实现指针的功能进而解决Josephus环问题。
1、构造Node类,类名为Node。
Public pointerNext As Node 'Node指针对象的前一条
Public pointerprevious As Node 'Node指针对象的后一条
Public data As Single '存放数据
Private Sub Class_Initialize() '类初始化时
Set pointerNext = Nothing
Set pointerprevious = Nothing
End Sub
Private Sub Class_Terminate()
Set pointerNext = Nothing
Set pointerprevious = Nothing
End Sub 2、VB中解决Josephus问题
有了上面的Node类,我们就可以在VB中利用环链表解决问题了。
首先我们在VB界面设计中创建两个文本框Text1和Text2,分别用来输入小孩总数(默认值为20)和报数的数(默认值为8),再需要一个命令按钮Command1。 Private pointerHead As Object
Public Sub CreateLinkList(n As Integer)
Dim pointer As Node '定义pointer为Node类(指针)
Dim nLoop As Integer
Static pointerLast As Node
pointerHead.data = 1
Set pointerLast = pointerHead
For nLoop = 2 To n
Set pointer = New Node
pointer.data = nLoop
Set pointerLast.pointerNext = pointer
Set pointer.pointerprevious = pointerLast
Set pointerLast = pointer
Next
Set pointerLast = Nothing
Set pointer.pointerNext = pointerHead
Set pointerHead.pointerprevious = pointer
End SubPublic Function Josephus(m As Integer) As Integer
Dim i As Integer
Dim f As Integer
Dim p, p1 As Node
Set p = pointerHead
For i = 1 To m - 1
Set p = p.pointerNext
Next
Set p1 = p.pointerprevious
Set p1.pointerNext = p.pointerNext
f = p.data
Set p = p.pointerNext
Set p.pointerprevious = p1
Set pointerHead = p
Josephus = f
End FunctionPrivate Sub Command1_Click()
Dim m As Integer
Dim n As Integer
Dim n1 As Integer
Dim msg As String
Set pointerHead = New Node
n = Val(Trim(Text1.Text))
m = Val(Trim(Text2.Text))
Call CreateLinkList(n)
Do While Not (pointerHead.pointerNext Is pointerHead)
n1 = Josephus(m)
msg = msg + "编号为" + Str(n1) + "的离队;" + Chr(13)
Loop
msg = msg + "最后编号为" + Str(Josephus(m)) + "的获胜。"
MsgBox msg
End Sub
这个问题就是Josephus问题的简单描述,以往看到的很多例子都是用C语言实现的,可能是因为VB中没有现成的指针的原因。我们就用构造类的方法来实现指针的功能进而解决Josephus环问题。
1、构造Node类,类名为Node。
Public pointerNext As Node 'Node指针对象的前一条
Public pointerprevious As Node 'Node指针对象的后一条
Public data As Single '存放数据
Private Sub Class_Initialize() '类初始化时
Set pointerNext = Nothing
Set pointerprevious = Nothing
End Sub
Private Sub Class_Terminate()
Set pointerNext = Nothing
Set pointerprevious = Nothing
End Sub 2、VB中解决Josephus问题
有了上面的Node类,我们就可以在VB中利用环链表解决问题了。
首先我们在VB界面设计中创建两个文本框Text1和Text2,分别用来输入小孩总数(默认值为20)和报数的数(默认值为8),再需要一个命令按钮Command1。 Private pointerHead As Object
Public Sub CreateLinkList(n As Integer)
Dim pointer As Node '定义pointer为Node类(指针)
Dim nLoop As Integer
Static pointerLast As Node
pointerHead.data = 1
Set pointerLast = pointerHead
For nLoop = 2 To n
Set pointer = New Node
pointer.data = nLoop
Set pointerLast.pointerNext = pointer
Set pointer.pointerprevious = pointerLast
Set pointerLast = pointer
Next
Set pointerLast = Nothing
Set pointer.pointerNext = pointerHead
Set pointerHead.pointerprevious = pointer
End SubPublic Function Josephus(m As Integer) As Integer
Dim i As Integer
Dim f As Integer
Dim p, p1 As Node
Set p = pointerHead
For i = 1 To m - 1
Set p = p.pointerNext
Next
Set p1 = p.pointerprevious
Set p1.pointerNext = p.pointerNext
f = p.data
Set p = p.pointerNext
Set p.pointerprevious = p1
Set pointerHead = p
Josephus = f
End FunctionPrivate Sub Command1_Click()
Dim m As Integer
Dim n As Integer
Dim n1 As Integer
Dim msg As String
Set pointerHead = New Node
n = Val(Trim(Text1.Text))
m = Val(Trim(Text2.Text))
Call CreateLinkList(n)
Do While Not (pointerHead.pointerNext Is pointerHead)
n1 = Josephus(m)
msg = msg + "编号为" + Str(n1) + "的离队;" + Chr(13)
Loop
msg = msg + "最后编号为" + Str(Josephus(m)) + "的获胜。"
MsgBox msg
End Sub
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货