Go语言(Golang)约瑟夫游戏(Joseph)

package main

import (
	"fmt"
)

//假设是一群小孩在玩这个游戏
//创建一个小孩的结构体
type BoyNode struct {
	No int //给每个小孩一个唯一的身份编号
	next *BoyNode //指向下一个小孩
}

//假设有number个小孩在玩游戏
func AddBoyNode(number int)  *BoyNode {
	head := &BoyNode {} //先创建一个头节点
	temp := &BoyNode {} //创建一个辅助节点
	for i := 1; i<= number; i++ {
		boy := &BoyNode {
			No : i,
		}
		if i == 1 {
			head = boy
			temp = boy
			temp.next = head
		} else {
			temp.next = boy
			temp.next.next = head
		}
		temp = temp.next
	}
	return head
}

//开始游戏
func Play(head *BoyNode, a, b int) *BoyNode {
	temp := head   //辅助节点指向头节点head
	helper := head	//辅助节点指向链表最后的节点
	//判断如果没有小孩无法游戏
	if temp.next == nil {
		fmt.Println("没有小孩,无法进行游戏!")
		return head
	}
	//小孩只剩一个的时候退出游戏
	if temp.next == head {
		fmt.Println("只有一个小孩了,游戏结束!最后一个小孩为:")
		return head
	}
	//将helper指向最后一个小孩
	for {
		if helper.next == head {
			break
		}
		helper = helper.next
	}
	//循环找到从第a个小孩开始游戏
	for {
		if temp.No == a {
			break
		}
		temp = temp.next
		helper = helper.next
	}
	//数到b时出列的小孩
	for i := 1; i < b; i++ {
		temp = temp.next
		helper = helper.next
	}
	//如果该小孩是第一个小孩,则将头节点指向下一个小孩
	if temp == head {
		head = head.next
	}
	helper.next = temp.next

	fmt.Println()
	fmt.Printf("小男孩:%d出列!",temp.No)
	fmt.Println()
	ListBoyNode(head)
	//下一次游戏从第a个小孩开始
	a = temp.next.No
	return Play(head,a,b)
}

//输出显示链表
func ListBoyNode(head *BoyNode) {
	temp := head
	for {
		fmt.Printf("小男孩:%d ==>",temp.No)
		temp = temp.next
		if temp == head {
			break
		}
	}
}


func main() {
	fmt.Println("请输入有多少个小孩玩游戏:")
	var number int
	fmt.Scan(&number)
	head := AddBoyNode(number)
	ListBoyNode(head)
	fmt.Println("请输入从第几个小孩开始游戏:")
	var a int 
	fmt.Scan(&a)
	fmt.Println("请输入数几的小男孩出列:")
	var b int 
	fmt.Scan(&b)
	head = Play(head,a,b)
	ListBoyNode(head)
}

  

猜你喜欢

转载自www.cnblogs.com/HouZhenglan/p/10083697.html