問(wèn)題描述
魔術(shù)師利用一副牌中的13張黑牌正林,預(yù)先將他們排好后疊放在一起,牌面朝下颤殴,對(duì)觀眾說(shuō):“我不看牌觅廓,只數(shù)數(shù)就可以猜到每張牌是什么,我大聲數(shù)數(shù)涵但,你們聽(tīng)杈绸,不信?現(xiàn)場(chǎng)演示矮瘟⊥В”魔術(shù)師將最上面的那張牌數(shù)為1,把他翻過(guò)來(lái)正好是黑桃A, 將黑桃A放到桌面上澈侠,第二次數(shù)1,2將第一張牌放在這些牌的下面劫侧,將第二張牌翻過(guò)來(lái),正好是黑桃2哨啃, 也將它放在桌子上這樣依次進(jìn)行將13張牌全部翻出烧栋,準(zhǔn)確無(wú)誤。
問(wèn)題:牌的開(kāi)始順序是如何安排的拳球?
代碼實(shí)現(xiàn)(C語(yǔ)言):
#include<stdafx.h>
#include<stdio.h>
#include<stdlib.h>
#define CardNumber 13
typedef struct node {
int data;
struct node *next;
}sqlist, *linklist;
//創(chuàng)建循環(huán)鏈表
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; //默認(rèn)所有元素都為0
if (head == NULL)
{
head = s;
}
else
{
r->next = s;
}
r = s;
}
r->next = head;
return head;
}
//發(fā)牌順序計(jì)算
void Magician(linklist head) {
linklist p = NULL;
int j;
int Countnumber = 2;
p = head;
p->data = 1;//第一張牌放1
while (1)
{
for (j = 0; j < Countnumber; j++)
{
p = p->next;
//程序的關(guān)鍵位置
if (p->data != 0)//該位置有牌的話就下一個(gè)位置
{
p->next;
j--;
}
}
if (p->data == 0)
{
p->data = Countnumber;
Countnumber++;
if (Countnumber == 14)
{
break;
}
}
}
}
//銷毀循環(huán)鏈表
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 < CardNumber; i++)
{
free(buff[i]);
}
*list = 0;
}
int main() {
linklist p = NULL;
int i;
p = CreateLinkList();
Magician(p);
printf("按如下順序排列:\n");
for (i = 0; i < CardNumber; i++)
{
p = p->next;
printf("黑桃:%d", p->data);
}
DestoryList(&p);
getchar();
return 0;
}
拉丁方陣問(wèn)題
拉丁方陣是一種nXn的方陣审姓,方陣中恰有n種不同的元素,每種元素恰有n個(gè)醇坝,并且每種元素在一行一列中恰好出現(xiàn)一次邑跪。著名數(shù)學(xué)家和物理學(xué)家歐拉使用拉丁字母作為拉丁方陣?yán)锏脑氐姆?hào),拉丁方陣因此而得名呼猪。
例如下圖是一個(gè)3X3的拉丁方陣:
問(wèn)題思路: 采用循環(huán)鏈表画畅,依次輸出,每次輸出元素后面的3個(gè)元素宋距。