魔术师发牌问题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)
}
魔术师手中有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)
}
相关文章推荐
- 相同问题go语言与php的实现对比
- Go语言实现的排列组合问题实例(n个数中取m个)
- 一个Go语言接口和多操作系统实现的简单例子
- 约瑟夫问题java语言实现代码
- GO语言 console 汉字 乱码 问题
- Go 语言中实现优雅的停止程序
- go语言学习笔记之冒泡排序的实现
- 搞了一天终于实现了 DataGrid 中的多国语言的问题,采用了中文向其他语言自动翻译的方法,其实不难,主要是想法(本文不涉及这个计算机技术问题,仅以此作为标题)
- 环形链表实现约瑟夫问题 java语言
- 魔术师发牌问题简单实现-循环链表
- go语言类型转换问题,求解?
- Go语言实现http共享
- 一个不错的Go语言实现的web框架
- 用贪心算法实现的背包问题(java语言)
- Go语言实现的简单TCP服务及使用MySql
- Go语言的中文编码问题
- Go语言中通过结构体匿名字段实现方法的继承和重载
- Go 语言实现exercise--Loops and Functions
- Go语言插入排序算法实现
- go语言有关结构体的问题