3 迴圈陣列實現約瑟夫(報數出圈)問題

2021-10-08 07:33:20 字數 2286 閱讀 5074

package 資料結構;

/* *

* 約瑟夫問題:

* * 設編號1、2、3...n的n個小孩圍坐一圈,約定編號為k的人從1開始報數,數到m的人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推

* 直到所有人出列位置,由此產生乙個出隊的編號序列

* (first指向第乙個結點)一開始的單個結點保持環形的性質——自反

* 新增乙個結點:建立乙個輔助指標,next指向新結點,新結點next指向起始結點,這樣就保證了環形性質

* 每次操作後將輔助指標後移乙個結點(這個指標用來定位「最後」的結點進行尾插法)

* *

* 實現:

* 1.建立乙個輔助指標(變數)helper,初始指向環形鍊錶的最後乙個結點

* 2.小孩報數時,將first和helper指標同時移動m-1次。

* 3.這時就可以將first指標指向的結點出圈:

* (1)first後移:first = first.next;

* (2)helper.next = first ;

* 從被刪除位置的前乙個直接指向後乙個,則這個結點被從整個圈中被「刪去」,等待被**

* *

* */

public

class

testjosephu

}//右擊source——generate的getter和setter可以被快速構建

//構建環形鍊錶

class

circlesinglelinkedlist

//使用for來建立環形鍊錶

boy curboy =

null

;//輔助指標

for(int i=

1;i<=nums;i++

)else}}

//遍歷環形鍊錶

public

void

showboy()

boy curboy = first;

while

(true

) curboy=curboy.

getnext()

;}}//計算小孩出圈順序

/** *

* @param startno表示從第幾個小孩開始數數

* @param countnum表示數的次數

* @param nums 表示最初在圈中的小孩數目

* */

//通過先讓first和helper先移動startno-1次來控制開始位置

public

void

countboy

(int startno,int countnum,int nums)

boy helper = first;

while

(true

) helper = helper.

getnext()

;}//小孩報數前,first和helper移動k-1次

for(int j=

0;j1;j++

)//當小孩報數時,讓first和helper指標同時移動m-1次,然後出圈

while

(true

)for

(int j=

0;j1;j++

) system.out.

printf

("小孩%d出圈\n"

,first.

getno()

);first =first.

getnext()

; helper.

setnext

(first);}

system.out.

printf

("最後留在圈中的小孩編號:%d\n"

,first.

getno()

);}}

/** * @param boy類是本次作為環形佇列的結點

* @param no是孩子的編號(初始)

* @param next指向下乙個結點,預設null

* 測試失敗,param是會對映到下面方法的引數的,這裡用在類上就不能正常顯示所有文字

* * */

class

boypublic int getno()

public

void

setno

(int no)

public boy getnext()

public

void

setnext

(boy next)

}

約瑟夫環的實現《報數遊戲》

面試中經常會被問到報數遊戲。遂實現一下。問題描述 設有n個人圍坐一圈並按順時針方向從1到n編號,從第s個人開始進行1到m報數,報數到第m個人時,此人出圈,再從他的下乙個人重新開始1到m的報數,如此進行下去直到所有的人都出圈為止。現要列印出出圈次序。輸入 n 遊戲總人數 s 報數的起始編號 m 報數的...

使用迴圈鍊錶實現約瑟夫環(圍圈報數問題)

剛開始學c,碰到經典的圍圈報數問題,現先將實現 附下 include include struct lnode typedef struct lnode lnode typedef struct lnode linklist struct lnode create int s 建立單項迴圈鍊錶 re...

約瑟夫環問題 佇列實現,迴圈陣列實現

起源 約瑟夫環問題的起源來自猶太歷史學家約瑟夫和他的朋友以及39其餘的猶太人,總共41人為了躲避敵人,藏在乙個山洞中,39個猶太人決定寧願死也不被敵人抓到,於是決定自殺,所有人排成乙個圈,由第乙個人開始報數,每當數到3,就自殺。這個遊戲接著從自殺的位置開始,還是從1數到3。依次類推,約瑟夫將朋友和自...