您的位置:首页 > 编程语言 > Go语言

魔术师发牌问题GO语言实现

2017-01-08 22:38 267 查看
问题描述:

       魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好(有花色的一面朝下)。魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……直到将所有的牌都翻出来为止。问原来牌的顺序是如何的。

package main
import (
"fmt"
"strconv"
)
//13张牌
const len int=13
type Node struct {
order int //牌序号
pNext *Node
}

type playingCard [len]string
//牌用数组存储
func (card *playingCard) newCard(){
card[0]="A"
for i:=1;i<10;i++ {
card[i]=strconv.Itoa(i+1)
}
card[10]="L"
card[11]="Q"
card[12]="K"
}
//建立循环链表
func createList()*Node {
phead:=new(Node)
phead.pNext=nil
q:=phead
for i:=1;i<=len;i++ {
pnew:=new(Node)
pnew.order=-1
q.pNext=pnew
q=pnew
}
q.pNext=phead.pNext
phead=nil
return q
}
//清空链表
func cleanList(list *Node){
p,q:=list.pNext,list.pNext
for p!=list && q!=nil{
q=q.pNext
p=nil
p=q
}
list.pNext=list
}
//销毁链表
func descotry(list *Node){
cleanList(list)
list=nil
}
//发牌
func magic(list *Node) {
count:=1
p:=list.pNext
p.order=0
for count<len {
number:=0
for number<=count{
p=p.pNext
if p.order==-1 {
number++
}
}
p.order=count
count++
}
}
//打印牌
func traverse(list *Node,card playingCard){
p:=list.pNext
for ;p!=list;p=p.pNext {
card.Print(p.order)
//fmt.Printf("%5d",p.order)
}
card.Print(p.order)
//fmt.Printf("%5d",p.order)
}

func (card playingCard) Print(index int) {
if index>=0 && index<len {
fmt.Printf("%5s",card[index])
}else {
fmt.Printf("%5s","空")
}
}
func main() {
var card playingCard
card.newCard()
//fmt.Println(card)
list:=createList()
defer descotry(list)
magic(list)
traverse(list,card)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息