本科系列課程參見:《軟體學院那些課》 問題描述
約瑟夫(Joeph)問題的一種描述是:編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止。試設計一個程式求出出列順序。
基本要求
利用單向迴圈鏈表格儲存體結構類比此過程,按照出列的順序印出各人的編號
演算法思想
遊戲實現的關鍵是遊戲資訊的儲存。包括玩家座位資訊,玩家所報數資訊以及密碼資訊。我們通過自訂單向迴圈鏈表Joeph_list儲存結構來實現遊戲過程的類比。鏈表以結點串連。結點Node儲存的資訊包括每個人手中的密碼、每個人的位置以及下一個結點在電腦中的儲存位置,及指向下一個結點的指標。值得注意的是,資訊“每個人的位置”是必不可少的,因為他不等同於結點在鏈表中的位置——但一個玩家被移除之後,鏈表後的元素位置會“前進”,而我們需要的玩家的位置始終是不變的。
玩家的報數,我們通過迴圈中計數器的遞增實現,當順序遞增到鏈表中最後一個結點,而迴圈仍沒有結束時,我們繼續從第一個元素開始遞增——及相當於最後一個玩家仍沒有報數到m我們就從第一個玩家重頭開始報數。直到計數器累加到m,則發現我們要移除的結點,記錄並輸出移出結點的資訊,繼續遊戲。直到鏈表中元素被清空,程式結束。
演算法的關鍵是將實際遊戲情境抽象到鏈表中的元素的尋找和移除上,要掌握清楚哪些資料代表哪些資訊,並熟悉程式運行中各種判斷的流程。
演算法流程
資料結構
在這個遊戲中,假定每個人都是一個節點,這樣有利於程式的理解。
[cpp] view plain copy template <class List_entry> struct Node{ List_entry code; // 儲存每個人手中 密碼 List_entry iposition; // 儲存每個人所處的 位置 Node<List_entry> *next; Node(); Node(List_entry a, List_entry b, Node<List_entry> *link=NULL); }; template <class List_entry> class Joeph_list{ public: Joeph_list(); int size() const; bool empty() const; void clear(); Error_code retrieve(int position, List_entry &x, List_entry &y) const; Error_code replace(int position, const List_entry &x, const List_entry &y); Error_code remove(int position, List_entry &x, List_entry &y); Error_code insert(int position, const List_entry &x, const List_entry &y); ~Joeph_list(); protected: int count; void Init(); // 初始化線性表 Node<List_entry> *head; Node<List_entry> *set_position(int position) const; // 返回指向第position個結點的指標 };
Node結構:表示實現Joeph_list以及List表的結點
Joeph_list類:儲存遊戲中玩家座位、密碼等資訊的資料結構
List類:以鏈表的方式儲存圖片等資料結構
全域對象game:SimpleWidow的視窗輸出遊戲過程
List<BitMap>tu;List<BitMap>shu;List<BitMap>people;分別儲存遊戲參與者報數、所持密碼、和遊戲參與者的圖片。
全域函數:
void Baoshu(int p,int s); 用以顯示遊戲參與者報數的效果
void Yizou(int p,int m); 用以移走報到數的遊戲參與者
void Code(int m); 用以更新密碼資訊
void Jieshu(); 結束遊戲
項目測試
1、遊戲開始,初始m為6,從第一個玩家開始自動報數,報到數的人出列
2、以出列人手中的密碼為密碼(不大於6)繼續遊戲
3、直到所有人出列,遊戲結束
項目示範
(*點擊圖片可跳轉到Youku視頻)
代碼及資料下載: http://download.csdn.net/detail/xiaowei_cqu/5068425
(轉載請註明作者和出處:http://blog.csdn.net/xiaowei_cqu 未經允許請勿用於商業用途)