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