日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

约瑟夫环Joeph

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 约瑟夫环Joeph 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本科系列課程參見:《軟件學院那些課》

問題描述

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

基本要求

利用單向循環鏈表存儲結構模擬此過程,按照出列的順序印出各人的編號

算法思想

游戲實現的關鍵是游戲信息的儲存。包括玩家座位信息,玩家所報數信息以及密碼信息。我們通過自定義單向循環鏈表Joeph_list存儲結構來實現游戲過程的模擬。鏈表以結點連接。結點Node存儲的信息包括每個人手中的密碼、每個人的位置以及下一個結點在計算機中的存儲位置,及指向下一個結點的指針。值得注意的是,信息“每個人的位置”是必不可少的,因為他不等同于結點在鏈表中的位置——但一個玩家被移除之后,鏈表后的元素位置會“前進”,而我們需要的玩家的位置始終是不變的。
玩家的報數,我們通過循環中計數器的遞增實現,當順序遞增到鏈表中最后一個結點,而循環仍沒有結束時,我們繼續從第一個元素開始遞增——及相當于最后一個玩家仍沒有報數到m我們就從第一個玩家重頭開始報數。直到計數器累加到m,則發現我們要移除的結點,記錄并輸出移出結點的信息,繼續游戲。直到鏈表中元素被清空,程序結束。
算法的關鍵是將實際游戲場景抽象到鏈表中的元素的查找和移除上,要掌握清楚哪些數據代表哪些信息,并熟悉程序運行中各種判斷的流程。

算法流程


數據結構

在這個游戲中,假定每個人都是一個節點,這樣有利于程序的理解。

[cpp]?view plaincopy
  • 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?未經允許請勿用于商業用途)

    總結

    以上是生活随笔為你收集整理的约瑟夫环Joeph的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。