拉丁方陣就是這樣的
比如4階拉丁方陣
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
每行每列沒重複的數字,這裡藉助迴圈單鏈表來實現,思路:第一遍曆(第一行的資料)從第一個結點(注意不是頭結點)開始,第二次遍曆(第二行的資料)從第二個結點開始,一次類推。。。。。。
代碼如下:(比較容易看懂,沒分.H檔案很.CPP檔案)
//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->GetLink());<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 />int num;<br />cout<<"請輸入拉丁方階數(2<=N<=9)";<br />cin>>num;<br />CirList<int> latin;<br />for(int i=1;i<=num;i++)<br />{<br />latin.AddTail(i);<br />}<br />latin.SetBegin();<br />latin.GetNextNode();<br />for(int j=0;j<num;j++)<br />{<br />for(int k=0;k<num;k++)<br />{<br />cout<<latin.GetCur()->GetData()<<" ";<br />latin.GetNextNode();<br />}<br />cout<<endl;<br />latin.GetNextNode();<br />//latin.GetNextNode();<br />}<br />return 0;<br />}