迴圈鍊錶的應用 魔術師發牌問題和拉丁方陣問題

2021-10-13 11:48:38 字數 1683 閱讀 5744

1.魔術師發牌問題

問題描述:魔術師利用一副牌中的13張黑牌,預先將他們排好後疊放在一起,牌面朝下。對觀眾說:「我不看牌,只數數就可以猜到每張牌是什麼,我大聲數數,你們聽,不信?現場演示。」魔術師將最上面的那張牌數為1,把他翻過來正好是黑桃a,將黑桃a放在桌子上,第二次數1,2,將第一張牌放在這些牌的下面,將第二張牌翻過來,正好是黑桃2,也將它放在桌子上這樣依次進行,將13張牌全部翻出,準確無誤。

問:牌的開始順序是如何安排的?請用迴圈鍊錶來解決

c++實現:

#include

using

namespace std;

#define cardnumber 13

//13張牌

class

listnode

;listnode*

createlist

(int n)

//尾插法建立無頭結點的迴圈鍊錶

p->next = head-

>next;

free

(head)

;return p-

>next;

}int

main()

} p-

>num = m;

m++;if

(m == cardnumber +1)

break

;//13張牌翻遍後退出迴圈

}//輸出

cout <<

"按如下順序排列:"

<< endl;

for(

int i =

0; i < cardnumber; i++

)else

if(l-

>num ==11)

else

if(l-

>num ==12)

else

if(l-

>num ==13)

l = l-

>next;

} cout << endl;

system

("pause");

return0;

}

2.拉丁方陣問題

拉丁方陣是一種nxn的方陣,方陣中恰有n種不同的元素,每種元素恰有n個,並且每種元素在一行和一列中恰好出現一次。著名數學家和物理學家尤拉使用拉丁字母來作為拉丁方陣裡元素的符號,拉丁方陣因此而得名。

例如下面是乙個3x3的拉丁方陣:

1 2 3

2 3 1

3 1 2

c++實現:

#include

using

namespace std;

class

listnode

;listnode*

createlist

(int n)

//尾插法建立無頭結點的迴圈鍊錶

p->next = head-

>next;

free

(head)

;return p-

>next;

}int

main()

cout << endl;

l = l-

>next;

}system

("pause");

return0;

}

魔術師發牌問題 迴圈鍊錶

問題描述 魔術師手裡一共有13張牌,全是黑桃,1 13.魔術師需要實現乙個魔術 這是十三張牌全部放在桌面上 正面向下 第一次摸出第一張,是1,翻過來放在桌面上。第二次摸出從上往下數第二張,是2,翻過來 放在桌面上,第一張放在最下面去,等會兒再摸 第三次摸出從上往下數第三張,是3,翻過來放在桌面上,第...

魔術師發牌問題(單迴圈鍊錶)

魔術師發牌問題,魔術師拿出13張黑桃撲克牌表演魔術,對底下觀眾講道,我只要數數就知道這張牌是什麼,然後數到1翻出來第一張a,並將a拿出來放到桌子上,用剩下的牌,重新數,數到2拿出來第2張牌.以此內推,求魔術師用怎樣的牌序才能達到此目的。首先分析問題,我們可以得到乙個大致的類似鍊錶牌序為 1 2 3 ...

魔術師發牌問題

說有乙個魔術師,他表演發牌的魔術,他將十三張黑桃牌放在一堆。然後開始數數,第一次,他數1,然後翻開第一張,果然是黑桃a,然後將黑桃a放到牌堆外。然後魔術師繼續數數,這次他數1,2,然後將數1的牌放到牌堆底,然後將數2的牌翻開,果然是黑桃2,然後將黑桃2放到一邊。繼續數1,2,3,果然每次都是對應的牌...