一、魔术师发牌问题
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的拉丁方阵:
那么如何用代码实现n X n的拉丁方阵呢,其实很简单,同样使用有n个元素的循环链表,逐行输出n个数字,第一行从第一个元素开始遍历,第二行从第二个元素开始遍历......以此类推
本文为原创文章,如果对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!