魔术师发牌问题 java_数据结构与算法之魔术师发牌问题

本文介绍了魔术师发牌问题的解决方案,通过循环链表来实现牌的初始顺序安排。此外,还探讨了拉丁方阵的概念,并提供了使用循环链表创建n X n拉丁方阵的代码实现。
摘要由CSDN通过智能技术生成

一、魔术师发牌问题

1.问题描述

魔术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下。对观众说:“我不看牌,只数数就可以猜到每张牌是什么。”魔术师把最上面的那张牌数为1,把他翻过来正好是黑桃A,将黑桃A放在桌子上,第二次数1,2,将第一张牌放在这些牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上这样依次进行将第13张牌全部翻出,准确无误。

2.问题:牌的开始顺序是如何安排的?

请利用循环链表来解决:

代码实现:Magician.c

#include

#include

#define CardNumber 13

typedef struct node{

int data;

struct node *next;

}sqlist, *linklist;

// 创建一个循环链表

linklist CreateLinkList(){

linklist head = NULL;

linklist s, r;

int i;

r = head;

for(i=1; i<=CardNumber; i++){

s = (linklist)malloc(sizeof(sqlist));

s->data = 0;

if(head == NULL){

head = s;

}else{

r->next = s;

}

r = s;

}

r->next = head;

return head;

}

// 发牌顺序计算

void Magician(linklist head){

linklist p;

int j;

int Countnumber = 2

p = head;

p->data = 1; // 第一张牌放1

while(1){

for(j=0; j

p = p->next;

if(p->data != 0){ // 该位置有牌的话,则下一个位置

p->next;

j--;

}

}

if(p->data == 0){

p->data = Countnumber;

Countnumber++;

if(Countnumber == 14)

break;

}

}

}

//销毁工作

void DestoryList(linklist* list){

linklist ptr = *list;

linklist buff[CardNumber];

int i = 0;

while(i < CardNumber){

buff[i++] = ptr;

ptr = ptr->next;

}

for(i=0; i

free(buff[i])

}

*list = 0;

}

int main(){

linklist p;

int i;

p = CreateLinkList();

Magician(p);

printf("按如下顺序排列:\n");

for(i=0; i

printf("黑桃%d", p->data);

p = p->next;

}

DestoryList(&p);

return 0;

}

二、拉丁方阵问题

1.问题描述

拉丁方阵是一种n X n的方阵,方阵中恰有n中不同的元素,每种元素恰有n个,并且每种元素在一行和一列恰好出现一次。著名数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵里元素的符号,拉丁方阵由此得名。如图,是一个3X3的拉丁方阵:

7f94e37259861b115165dce79c76f1d3.png

那么如何用代码实现n X n的拉丁方阵呢,其实很简单,同样使用有n个元素的循环链表,逐行输出n个数字,第一行从第一个元素开始遍历,第二行从第二个元素开始遍历......以此类推

本文为原创文章,如果对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值