1. 程式人生 > >算法神馬的,需要再加一個約瑟夫環問題

算法神馬的,需要再加一個約瑟夫環問題

init 方式 指針 turn pre 約瑟夫環 child 方法 count

# 約瑟夫問題 不使用鏈表 純計算方式得到:
# 第一種方法的實現,只能從頭開始報數,沒有辦法隨機指定從什麽位置開始
# 如果只用YsfTest 可以用傳 n 的方式 來求出第幾輪被pop掉的序號

# 約瑟夫環的第一種實現:
def YsfTest(count,doom,n):
if n ==1:
temp = (count + doom - 1)%count
return temp
else:
temp = (YsfTest(count - 1,doom,n - 1)+doom)%count
return temp

def Run(count,doom):
li = []
for i in range(1,count+1):
if i == count:
res = YsfTest(count,doom,i)
print(‘生存人員的編號:‘,res)
else:
res = YsfTest(count,doom,i)
li.append(res)
return li



# 第二種實現方案:
# 首先先需要實例化一下,然後再進行函數的調用
# 一個循環鏈表的思路,創建一個起始的first,結尾的tail指針
# 如果從第幾個孩子開始就 那麽起始的first,結尾的tail指針就指向對應位置
class Child(object):
first =None
def __init__(self,no=None,pNext=None):
self.no=no
self.pNext = pNext
def addChild(self,n):
cur =None
for i in range(n):
child = Child(i + 1)
if i ==0:
self.first = child
child.pNext = self.first
cur = self.first
else:
cur.pNext = child
child.pNext = self.first
cur = cur.pNext

def showChild(self): # 檢測用的 可以不寫
cur = self.first
while cur.pNext != self.first:
print(‘當前孩子的編號:%s‘%cur.no)
cur =cur.pNext
print("1當前孩子編號:%s"%cur.no)

# m為doom報的數,k是從第幾個孩子開始(就把first,tail指針移動相對應位置)
def countChild(self,m,k):
tail = self.first
while tail.pNext != self.first:
tail = tail.pNext
for i in range(k-1):
tail = tail.pNext
self.first = self.first.pNext
while tail != self.first:
for i in range(m-1):
tail = tail.pNext
self.first = self.first.pNext
self.first = self.first.pNext
tail.pNext = self.first
print(‘最終剩下孩子的編號:‘,self.first.no)

算法神馬的,需要再加一個約瑟夫環問題