码迷,mamicode.com
首页 > 编程语言 > 详细

线性表应用--Josephus问题的解法(Python 版)

时间:2018-09-01 12:42:27      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:方式   现在   链表   col   处理   线性   处理过程   ...   顺序表   

线性表应用

           --Josephus问题的解法(Python 版)

Josephus问题描述:假设有n个人围坐一圈,现在要求从第k个人开始报数,报到第m个数的人退出。然后从下一个人开始继续报数并按照相同的规则退出,直到所有人退出。要求按顺序输各出列人的编号。  

  1. 基于数组概念解法

    1. 建立一个包含n个人的表
    2. 找到第k个人,从那里开始
    3. 处理过程中采用吧相应元素修改为0的方式表示已经退出,反复做:
    4. 数m个(尚在坐的)人,遇到表的末端转回到下标0继续
    4. 把表示第m个人的表元素修改为0
    5. n个人出列表示结束

     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的人

    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. 基于循环单链表的解法


线性表应用--Josephus问题的解法(Python 版)

标签:方式   现在   链表   col   处理   线性   处理过程   ...   顺序表   

原文地址:https://www.cnblogs.com/zlsgh/p/9559967.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!