問題描述:魔術師利用一副牌中的13張黑牌,預先將他們排好後疊放在一起,牌面朝下。對觀眾說:“我不看牌,只數數就可以猜到每張牌是什麼,我大聲數數,你們聽,不信?現場示範。”魔術師將最上面的那張牌數為1,把他翻過來正好是黑桃A,將黑桃A放在桌子上,然後順序從上到下數手上的餘牌,第二次數1,2,將第一張牌放在這些牌的下面,將第二章牌翻過來,正好是黑桃2,也將它放在桌子上,第三次數1,2,3,將前面兩張依次放在這些牌的下面,再翻第三章牌正好是黑桃3。這樣依次進行將13張牌全部翻出,準確無誤。
問題:牌的開始順序是如何安排的?
沒有再次劃分出.h檔案了,由於比較簡單,就放到一起了。
代碼如下:
//CirListNode類<br />#include<stdio.h><br />template <class T> class CirListNode<br />{<br /> T data;<br /> CirListNode<T>* link;<br /> public:<br /> CirListNode():link(NULL){}<br /> CirListNode(T value):link(NULL),data(value){}<br /> ~CirListNode(){}<br /> void SetLink(CirListNode<T>* next);<br /> CirListNode<T>* GetLink();<br /> T& GetData();<br />void SetData(T value);<br />};<br />template<class T><br />void CirListNode<T>::SetData(T value)<br />{<br />data=value;<br />}</p><p>template<class T><br />void CirListNode<T>::SetLink(CirListNode<T>* next)<br />{<br /> link=next;<br />}<br />template<class T><br />CirListNode<T>* CirListNode<T>::GetLink()<br />{<br /> return link;<br />}<br />template<class T><br />T& CirListNode<T>::GetData()<br />{<br /> return data;<br />} </p><p>//CirList類<br />template<class T> class CirList<br />{<br /> CirListNode<T>* head;<br /> CirListNode<T>* tail;<br /> CirListNode<T>* cur;<br /> public:<br /> CirList();<br /> ~CirList(){};<br /> bool AddTail(T value);<br /> void RemoveThis();<br /> void RemoveAll();<br /> void SetBegin();<br /> int GetCount();<br /> CirListNode<T>* GetCur();<br /> bool IsEmpty();<br /> T GetNext();<br />CirListNode<T>* GetNextNode();<br />void SetData(T value);<br />};<br />//CirList成員函數實現<br />template<class T><br />void CirList<T>::SetData(T value)<br />{<br />cur->SetData(value);<br />}</p><p>template<class T><br />CirListNode<T>* CirList<T>::GetNextNode()<br />{<br />cur=cur->GetLink();<br />return cur;<br />}</p><p>template<class T><br />CirList<T>::CirList()<br />{<br /> head=tail=new CirListNode<T>;<br /> cur=NULL;<br /> head->SetLink(head);<br />}<br />template <class T><br />bool CirList<T>::AddTail(T value)<br />{<br /> CirListNode<T>* add=new CirListNode<T>(value);<br /> tail->SetLink(add);<br /> tail=tail->GetLink();<br /> tail->SetLink(head);<br /> if(tail!=NULL)<br /> {<br /> return true;<br /> }<br /> else<br /> return false; </p><p>}<br />template<class T><br />void CirList<T>::RemoveThis()<br />{<br /> if(cur==head)<br /> {<br /> cur=cur->GetLink();<br /> }<br />CirListNode<T>* preCur=cur;<br />for(int i=0;i<this->GetCount();i++)<br />{<br /> preCur=preCur->GetLink();<br />}<br />preCur->SetLink(cur->GetLink());<br />cur=preCur->GetLink();<br />preCur=NULL;<br />}<br />template<class T><br />void CirList<T>::RemoveAll()<br />{<br /> SetBegin();<br /> int length=GetCount();<br /> for(int i=0;i<length;i++)<br /> {<br /> RemoveThis();<br /> }<br /> cur=head;<br />}<br />template<class T><br />void CirList<T>::SetBegin()<br />{<br /> cur=head;<br />}<br />template<class T><br />int CirList<T>::GetCount()<br />{<br /> int num=0;<br /> CirListNode<T>* here=cur;<br /> while(cur->GetLink()!=here)<br /> {<br /> cur=cur->GetLink();<br /> ++num;<br /> }<br /> cur=cur->GetLink();<br /> return num;<br />}<br />template<class T><br />CirListNode<T>* CirList<T>::GetCur()<br />{<br /> return cur;<br />}<br />template<class T><br />bool CirList<T>::IsEmpty()<br />{<br /> return head->GetLink()==head;<br />}<br />template<class T><br />T CirList<T>::GetNext()<br />{<br /> if(cur==head)<br /> {<br /> cur=cur->GetLink();<br /> }<br /> T num =cur->GetData();<br /> cur=cur->GetLink();<br /> return num;<br />} </p><p>#include<iostream><br />using namespace std;<br />int main()<br />{<br />CirList<int> poker;<br />for(int i1=0;i1<13;i1++)<br />poker.AddTail(0);<br />poker.SetBegin();<br />poker.GetNextNode();<br />for(int i=1;i<14;i++)<br />{<br />poker.SetData(i);<br />for(int j=0;j<=i;j++)<br />{<br />poker.GetNextNode();<br />if(poker.GetCur()->GetData()!=0)<br />{<br />j--;<br />}<br />if(i==13)<br />break;<br />}<br />}<br />poker.SetBegin();<br />poker.GetNextNode();<br />for(int k=0;k<13;k++)<br />{<br />cout<<poker.GetCur()->GetData()<<"*";<br />poker.GetNextNode();<br />}<br />cout<<endl;<br />return 0;</p><p>}