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 }