演算法設計 約瑟夫環

2021-12-29 16:24:11 字數 2276 閱讀 6318

問題描述

約瑟夫(joeph)問題的一種描述是:編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼(正整數)。一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直至所有人全部出列為止。試設計乙個程式求出出列順序。

基本要求

利用單向迴圈鍊錶儲存結構模擬此過程,按照出列的順序印出各人的編號

演算法思想

遊戲實現的關鍵是遊戲資訊的儲存。包括玩家座位資訊,玩家所報數資訊以及密碼資訊。我們通過自定義單向迴圈鍊錶joeph_list儲存結構來實現遊戲過程的模擬。鍊錶以結點連線。結點node儲存的資訊包括每個人手中的密碼、每個人的位置以及下乙個結點在計算機中的儲存位置,及指向下乙個結點的指標。值得注意的是,資訊「每個人的位置」是必不可少的,因為他不等同於結點在鍊錶中的位置——但乙個玩家被移除之後,鍊錶後的元素位置會「前進」,而我們需要的玩家的位置始終是不變的。

玩家的報數,我們通過迴圈中計數器的遞增實現,當順序遞增到鍊錶中最後乙個結點,而迴圈仍沒有結束時,我們繼續從第乙個元素開始遞增——及相當於最後乙個玩家仍沒有報數到m我們就從第乙個玩家重頭開始報數。直到計數器累加到m,則發現我們要移除的結點,記錄並輸出移出結點的資訊,繼續遊戲。直到鍊錶中元素被清空,程式結束。www.2cto.com

演算法的關鍵是將實際遊戲場景抽象到鍊錶中的元素的查詢和移除上,要掌握清楚哪些資料代表哪些資訊,並熟悉程式執行中各種判斷的流程。

演算法流程

資料結構

在這個遊戲中,假定每個人都是乙個節點,這樣有利於程式的理解。

[cpp]  

template  

struct node{  

list_entry code;             // 儲存每個人手中   密碼  

list_entry iposition;        // 儲存每個人所處的 位置  

node *next;  

node();  

node(list_entry a, list_entry b, node *link=null);  

template  

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 *head;  

node *set_position(int position) const;         

// 返回指向第position個結點的指標  

node結構:表示實現joeph_list以及list表的結點

joeph_list類:儲存遊戲中玩家座位、密碼等資訊的資料結構

list類:以鍊錶的方式儲存等資料結構

全域性物件game:******widow的視窗輸出遊戲過程

listtu;listshu;listpeople;分別儲存遊戲參與者報數、所持密碼、和遊戲參與者的。

全域性函式:

void baoshu(int p,int s); 用以顯示遊戲參與者報數的效果

void yizou(int p,int m); 用以移走報到數的遊戲參與者

void code(int m);  用以更新密碼資訊

void jieshu(); 結束遊戲

專案測試

1、遊戲開始,初始m為6,從第乙個玩家開始自動報數,報到數的人出列

2、以出列人手中的密碼為密碼(不大於6)繼續遊戲

3、直到所有人出列,遊戲結束

專案演示

演算法設計 約瑟夫環

本科系列課程參見 軟體學院那些課 約瑟夫 joeph 問題的一種描述是 編號為1,2,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上...

約瑟夫環演算法

約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。2b求解 private void myjosf int teamle...

演算法 約瑟夫環

已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍 使用 list 來模擬環結構,不被淘汰則將其加入到 list 尾部,淘汰的直接移除。需注意,以編號 k 為第乙個報數的人,需要調整其在報數正式開啟前到 list 的頭部。param n 人的總數 param k 開始報數的序號,1 k n...