约瑟夫环
来源:互联网 发布:玩转财务大数据 编辑:程序博客网 时间:2024/06/05 21:57
约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。
有个囚犯站成一个圆圈,准备处决。首先从一个人开始,越过(m-1)个人,并杀掉第m个人。接着,再越过m-1个人,并杀掉第m个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。
问题是,给定了和m,一开始要站在什么地方才能避免被处决?
问题扩展之后就是:约瑟夫环的起始位置是C,并不是第一个。
分析:首先要建立一个循环链表示人站的圆圈。然后找到起始位置(C),最后按照M规则删除链表中的元素。
假设一共7个人(N = 7),相隔的位置为2(M = 2),起始位置为3(C = 3)。
所以最后得到的序列是:[5, 7, 2, 4, 1, 6, 3]
python 代码实现:
# -*- coding: utf-8 -*-class Node(object):def __init__(self, value):self.value = valueself.next = Nonedef create_linkList(n):head = Node(1)pre = headfor i in range(2, n+1):newNode = Node(i)pre.next= newNodepre = newNodepre.next = headreturn headdef josephus(N,M,C): head = create_linkList(N) pre = None cur = head JoseList = [] if M == 1: for i in range(N): JoseList.append((C+i+1)%N) else: for i in range(C): cur = cur.next while cur.next != cur: # 终止条件是节点的下一个节点指向本身 for i in range(M - 1): pre = cur cur = cur.next JoseList.append(cur.value) pre.next = cur.next cur.next = None cur = pre.next JoseList.append(cur.value) return JoseListn = 7 #总的个数m = 2 #间隔的数目c = 3 #当前位置newlist = josephus(n,m,c)print(newlist)
结果显示:
阅读全文
0 0
- 约瑟夫问题、约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- Android Studio小白笔记(一)
- JS总结——BOM
- ATS 设置
- Sublime Text编辑器开启或关闭Vim模式
- 分词算法模型学习笔记(三)——CRF
- 约瑟夫环
- C++多态,虚函数小结
- df命令和挂载相关
- 如何更为高效的时间管理探索&&二零一六至二零七的总结
- centos6 安装tomcat
- POJ1231 max sum sequences DP
- 基于js对象,操作属性、方法详解
- LeetCode215. Kth Largest Element in an Array(Medium)
- 解决一些基础的html编写问题