github.com/gogf/gf@v1.16.9/.example/container/gring/gring_josephus.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/gogf/gf/container/gring"
     7  )
     8  
     9  type Player struct {
    10  	position int  // 位置
    11  	alive    bool // 是否存活
    12  }
    13  
    14  const (
    15  	playerCount = 41 // 玩家人数
    16  	startPos    = 1  // 开始报数位置
    17  )
    18  
    19  var (
    20  	deadline = 3
    21  )
    22  
    23  func main() {
    24  	// 关闭并发安全,当前场景没有必要
    25  	r := gring.New(playerCount, false)
    26  
    27  	// 设置所有玩家初始值
    28  	for i := 1; i <= playerCount; i++ {
    29  		r.Put(&Player{i, true})
    30  	}
    31  
    32  	// 如果开始报数的位置不为1,则设置开始位置
    33  	if startPos > 1 {
    34  		r.Move(startPos - 1)
    35  	}
    36  
    37  	counter := 1   // 报数从1开始,因为下面的循环从第二个开始计算
    38  	deadCount := 0 // 死亡人数,初始值为0
    39  
    40  	// 直到所有人都死亡,否则循环一直执行
    41  	for deadCount < playerCount {
    42  		// 跳到下一个人
    43  		r.Next()
    44  
    45  		// 如果是活着的人,则报数
    46  		if r.Val().(*Player).alive {
    47  			counter++
    48  		}
    49  
    50  		// 如果报数为deadline,则此人淘汰出局
    51  		if counter == deadline {
    52  			r.Val().(*Player).alive = false
    53  			fmt.Printf("Player %d died!\n", r.Val().(*Player).position)
    54  			deadCount++
    55  			counter = 0
    56  		}
    57  	}
    58  }