一、实现约瑟夫环
1、方式一
package main
import (
"container/ring"
"fmt"
)
type Player struct {
pos int
aLive bool
}
const (
playerCount = 100
startPos = 1
deadline = 3
)
func main() {
r := ring.New(playerCount)
//循环加载
for i := startPos; i <=playerCount ; i++ {
r.Value = &Player{
pos: i,
aLive: true,
}
r = r.Next()
}
if startPos > 1 {
r = r.Move(startPos - 1)
}
//从第一个开始报数
counter := 1
//死亡数量
deadCount := 0
for deadCount < playerCount {
//跳至下一个
r = r.Next()
if r.Value.(*Player).aLive {
counter++
}
if counter == deadline {
r.Value.(*Player).aLive = false
fmt.Println("死亡",r.Value.(*Player).pos)
deadCount++ //死亡人数
counter = 0
}
}
}
2、方式二
package main
import (
"container/ring"
"fmt"
)
func main() {
const (
playerCount = 100
startPos = 1
deadline = 3
)
r := ring.New(playerCount)
//循环加载
for i := startPos; i <=playerCount ; i++ {
r.Value = i
r = r.Next()
}
if startPos > 1 {
r = r.Move(startPos - 1)
}
//从第一个开始报数
counter := 1
//死亡数量
deadCount := 0
rev := r.Prev()
for deadCount < playerCount {
if counter == deadline {
rev.Link(rev.Move(2))
fmt.Println("死亡",r.Value)
r = rev.Next()
deadCount++ //死亡人数
counter = 0
counter++
} else {
rev = r
r = r.Next()
counter++
}
}
}