問題描述:
假設有n個人圍坐一圈,現在要求從第k個人開始報數,報到第m個數的人出列,然後從下乙個人繼續開始以同樣的方法報數,直到所有的人都出列為止,要求按順序輸出各出列的人的編號。
演算法設計:
1)建立包含指定節點的迴圈鍊錶,可以先建立乙個空表,然後再尾部逐漸加入元素。
2)迴圈計數,找到並刪除應該退出的節點。
**實現:
#首先定義乙個結點類
class
lnode
:def
__init__
(self,elem,next_=
none):
self.elem=elem
self.
next
=next_
#再定義乙個迴圈鍊錶類
class
lclist
:#初始化尾結點
def__init__
(self)
: self._rear=
none
#判斷是否為空
defis_empty
(self)
:return self._rear is
none
#從前端插入資料
defprepend
(self,elem)
: p=lnode(elem)
if self._rear is
none
: p.
next
=p self._rear=p
else
: p.
next
=self._rear.
next
self._rear.
next
=p #從尾端插入
def(self,elem)
: self.prepend(elem)
self._rear=self._rear.
next
#從前端彈出元素
defpop
(self)
:if self._rear is
none
:raise valuerror(
'in pop of cllist'
) p=self._rear.
next
if self._rear is p:
self._rear=
none
else
: self.rear.
next
=p.next
return p.elem
#輸出所有表元素
defprintall
(self)
:if self.is_empty():
return
p=self._rear.
next
while p is
not self._rear:
print
(p.elem)
p=p.
next
#定義約瑟夫環類,繼承自迴圈鍊錶類
class
josephus
(lclist)
:#定義乙個新方法用於實現結點環的迴圈
defturn
(self,m)
:for i in
range
(m):
self._rear=self._rear.
next
def__init__
(self,n,k,m)
:super()
.__init__(
)for i in
range
(n):1)
#從第k個人開始報數,將此元素移動到表頭
self.turn(k-1)
#開始迴圈報數
while
not self.is_empty():
self.turn(m-1)
#把報數到m人移動到表頭
p=self.pop(
)print
(p,end=
'\n'
if self.is_empty(
)else
', '
)
迴圈鍊錶解決約瑟夫環問題
題目要求的約瑟夫環操作 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人只有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...
使用鍊錶解決約瑟夫環問題
1139 約瑟夫環問題 時間限制 500ms 記憶體限制 65536k 提交次數 157 通過次數 79 題型 程式設計題 語言 g gcc description 約瑟夫 josephus 環是這樣的 假設有n個小孩圍坐成乙個圓圈,並從1開始依次給每個小孩編上號碼。老師指定從第s位小孩起從1開始報...
迴圈鍊錶解決約瑟夫環問題
問題描述 假設有n個小孩按照序號1,2,n圍坐成一圈,從第乙個小孩開始報數,每次報到n的人退出,接著從下乙個人重新開始從1開始報數,下一次再報到n的人退出,求最後乙個留下的人 小孩的個數n,和報數的n由鍵盤輸入 輸出留下人的序號 乙個迴圈鍊錶都寫得除出了很多問題,改了半天才出來 include in...