線性表應用--Josephus問題的解法(Python 版)

線性表應用

           --Josephus問題的解法(Python 版)數組

Josephus問題描述:假設有n我的圍坐一圈,如今要求從第k我的開始報數,報到第m個數的人退出。而後從下一我的開始繼續報數並按照相同的規則退出,直到全部人退出。要求按順序輸各出列人的編號。  數據結構

  1. 基於數組概念解法

    1. 創建一個包含n我的的表
    2. 找到第k我的,從那裏開始
    3. 處理過程當中採用吧相應元素修改成0的方式表示已經退出,反覆作:
    4. 數m個(尚在坐的)人,遇到表的末端轉回到下標0繼續
    4. 把表示第m我的的表元素修改成0
    5. n我的出列表示結束app

     1 def josephus(n,k,m):  2     people = list(range(1,n+1))  # 初始化,序列標號 1,2,3,...,n
     3     i = k - 1  # i 記錄了第k我的的下標
     4     for num in range(n):  # 循環n次
     5         count = 0  6         while count < m :  7             if people[i] > 0:  # 跳過 已經退出的人
     8                 count += 1
     9             if count == m :  # 這裏注意: i還沒+1
    10                 print(people[i], end="") 11                 people[i] = 0 12             i = (i + 1) % n   # 控制 i 的循環
    13         if num < n + 1 : 14             print(", ",end="") 15         else : 16             print("")
  2. 基於順序表的解法 

    利用列表的性質,彈出報數爲m的人spa

    1 # 利用列表的性質,彈出報數爲m的人
    2 
    3 def josephus_L(n,k,m): 4     people = list(range(1,n+1)) 5     num , i  = n , k-1
    6     for num in range(n,0,-1): 7         i = (i + m - 1) % num  # 報數m的人的下標
    8         print(people.pop(i),end="") # 報數第m個數的人彈出後 i 自動指向下一個
    9     return
  3. 基於循環單鏈表的解法

     1 #基於單循環鏈表的解法  2 
     3 class Josephus(LCList) :  4 
     5     def turn(self,m):  6         for i in range(m) :  7             self._rear = self._rear.next  # self._rear 指向尾節點
     8 
     9     def __init__(self,n,k,m) : 10         LCList.__init__(self) : 11         for i in range(n) : 12             self.append(i + 1) 13         self.turn(k-1) 14         while not self.is_empty() : 15             self.turn(m-1)  # 循環m次,self._rear 指向m,彈出 m+1
    16             print(self.pop(),end=("\n" if self.is_empty() else ", ")) 17 
    18 Josephus(10,2,7) # 運行

     LCList 的定義請查看本人博客的文章: 數據結構之線性表code

相關文章
相關標籤/搜索