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。依次類推,約瑟夫將朋友和自...