程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [算法設計]約瑟夫環

[算法設計]約瑟夫環

編輯:C++入門知識

問題描述 約瑟夫(Joeph)問題的一種描述是:編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止。試設計一個程序求出出列順序。 基本要求 利用單向循環鏈表存儲結構模擬此過程,按照出列的順序印出各人的編號 算法思想 游戲實現的關鍵是游戲信息的儲存。包括玩家座位信息,玩家所報數信息以及密碼信息。我們通過自定義單向循環鏈表Joeph_list存儲結構來實現游戲過程的模擬。鏈表以結點連接。結點Node存儲的信息包括每個人手中的密碼、每個人的位置以及下一個結點在計算機中的存儲位置,及指向下一個結點的指針。值得注意的是,信息“每個人的位置”是必不可少的,因為他不等同於結點在鏈表中的位置——但一個玩家被移除之後,鏈表後的元素位置會“前進”,而我們需要的玩家的位置始終是不變的。 玩家的報數,我們通過循環中計數器的遞增實現,當順序遞增到鏈表中最後一個結點,而循環仍沒有結束時,我們繼續從第一個元素開始遞增——及相當於最後一個玩家仍沒有報數到m我們就從第一個玩家重頭開始報數。直到計數器累加到m,則發現我們要移除的結點,記錄並輸出移出結點的信息,繼續游戲。直到鏈表中元素被清空,程序結束。www.2cto.com 算法的關鍵是將實際游戲場景抽象到鏈表中的元素的查找和移除上,要掌握清楚哪些數據代表哪些信息,並熟悉程序運行中各種判斷的流程。 算法流程 數據結構 在這個游戲中,假定每個人都是一個節點,這樣有利於程序的理解。 [cpp]   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、直到所有人出列,游戲結束   項目演示

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved