约瑟夫环

Python练习——约瑟夫环问题、用类方法描述一个数字时钟

大兔子大兔子 提交于 2019-12-03 07:02:38
一、约瑟夫环问题 有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他后面的人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。由于上帝的保佑,15个基督徒都幸免于难,问这些人最开始是怎么站的,哪些位置是基督徒哪些位置是非基督徒。 def main(): persons=[True]*30 #创建一个列表,元素全部为True,即假定30个人全为基督徒 count,i,number=0,0,0 while count<15: #记数,非基督徒有15人 if persons[i]: number+=1 #遍历列表元素 if number==9: #第9个人 persons[i]=False #将该列表元素改为False,即非基督徒 count+=1 number=0 i+=1 #从下一个人开始数 i%=30 for person in persons: print('基'if person else '非',end='') main() 二、用类方法描述一个数字时钟 from time import sleep import os class Clock(object): def __init__(self,hour=0,minute=0

约瑟夫环问题小结

匿名 (未验证) 提交于 2019-12-03 00:40:02
一 问题描述 约瑟夫环问题的基本描述如下:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。 从编号为1的人开始报数 ,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,要求找到最后一个出列的人或者模拟这个过程。 二 问题解法 在解决这个问题之前,首先我们对人物进行虚拟编号,即相当于从0开始把人物重新进行编号,即用0,1,2,3,...n-1来表示人物的编号,最后返回的编号结果加上1,就是原问题的解(为什么这么做呢,下文有解释)。而关于该问题的解通常有两种方法: 1.利用循环链表或者数组来模拟整个过程。 具体来讲,整个过程很明显就可以看成是一个循环链表删除节点的问题。当然,我们也可以用数组来代替循环链表来模拟整个计数以及出列的过程。此处只给出利用数组来模拟这个过程的解法,最终结果为最后一个出列的人的编号: #include<iostream> #include<unordered_map> #include<queue> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<sstream> #include<set> #include<map> using namespace std; int main() { int

循环链表模拟约瑟夫环

匿名 (未验证) 提交于 2019-12-03 00:21:02
第二个实验~~~循环链表实现约瑟夫环 问题描述: 约瑟夫(joseph):编号为1,2,。。。,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。试设计一个程序显示出列顺序。 〖基本要求〗:利用单向循环链表存储结构模拟此过程,按照出列的顺序打印出各人的编号。 〖测试数据〗:m的初值为20,密码:3,1,7,2,4,8,6 〖结果为〗:出列编号:6,1,4,7,5,3,2 实验步骤: (1)定义结构体及所存储人的序号和密码 typedef struct LNode { }; struct LNode *head,*p,*pt; (2)创建循环链表函数 定义一个变量i,给头指针分配内存空间,如果分配不成功,则返回0,否则就将head赋值给指针p,通过一个for循环给指针pt分配内存空间,如果分配不成功,则返回0,否则就将pt赋值给p所指的下一个指针。之后退出for循环开始构建循环链表,令头指针复制给p所指向的下一个指针,head赋值给p指针,将最后指针与头指针连接起来形成了循环链表。 int creatLinkList(int n) { } (3)创建所需密码函数

自己想的一种约瑟夫环问题的解决方案---基于单向循环链表

匿名 (未验证) 提交于 2019-12-02 23:56:01
1 //结点类 2 package cn.ftf.mylinklist; 3 public class Node { 4 public Object obj; 5 public Node next; 6 public Node() { 7 super(); 8 } 9 public Node(Object obj, Node next) { 10 super(); 11 this.obj = obj; 12 this.next = next; 13 } 14 public Node(Object obj) { 15 super(); 16 this.obj = obj; 17 } 18 } 1 package cn.ftf.mylinklist; 2 /* 3 * 手写约瑟夫环,用结点类代替小孩 4 */ 5 6 //单向循环链表类 7 public class CircularLinkList { 8 Node firstNode=null; 9 int count=0; 10 11 public CircularLinkList(int count) { 12 this.count = count; 13 addNode(count); 14 } 15 public void addNode(int aa){ 16 Node temp=null; 17 for(int i=1

约瑟夫环问题(线性表)

淺唱寂寞╮ 提交于 2019-12-02 12:00:50
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 输入 8 1 3 (n=8 k=1 m=3 ) 输出 7 (剩下的那个) 样例输入 8 3 1 样例输出 7 思路:循环链表 AC代码: # include <iostream> # include <cstdio> # include <algorithm> using namespace std ; const int maxn = 10000 ; int a [ 1000010 ] , b [ 100010 ] ; template < class T > struct node { int data ; node < T > * next ; } ; template < class T > class lian { node < T > * first ; int l ; public : lian ( ) ; lian ( T a [ ] , int n ) ; void show ( ) ; void weishan ( int k , int m ) ; } ; template < class T > lian < T > ::

约瑟夫环(动态内存)

只谈情不闲聊 提交于 2019-12-02 11:31:48
//约瑟夫环 # include <stdio.h> int main ( ) { int i , k , m , n , num [ 50 ] , * p ; printf ( "n=" ) ; scanf ( "%d" , & n ) ; p = num ; for ( i = 0 ; i < n ; i ++ ) //向每个人赋序号 * ( p + i ) = i + 1 ; //数组中第0个是序号1 i = 0 ; k = 0 ; m = 0 ; while ( m < n - 1 ) //即未退出人数大于1时执行函数 { if ( * ( p + i ) != 0 ) //没有走的人加1 k ++ ; if ( k == 3 ) //第三位退出圈子 { * ( p + i ) = 0 ; ///赋值0就是退出圈子 k = 0 ; //k是点名计算的人数 m ++ ; //m为退出人数 } i ++ ; //每次循环的人数 if ( i == n ) //循环一遍后回到开始位置 i = 0 ; } while ( * p == 0 ) p ++ ; printf ( "号码是%d\n" , * p ) ; return 0 ; } 来源: https://blog.csdn.net/qq_44912708/article/details/102756483

约瑟夫环

只愿长相守 提交于 2019-12-02 04:50:43
约瑟夫问题 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。 解题方法 考虑用链表进行删除,时间复杂度为O(NM),显然是不优秀的 这里考虑用递推公式进行求解 递推公式 $F(N,M)=((N-1,M)+M)%N$ 证明 来源: https://www.cnblogs.com/Larry-Zero/p/11730545.html

约瑟夫问题

回眸只為那壹抹淺笑 提交于 2019-12-01 09:53:14
Josephu(约瑟夫,约瑟夫环)问题 问题表述为:设编号为1,2,...,n的n个人围坐一圈,约定编号为K(1<=k<=n)的人开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依此类推,直到所有人出列为止,由此产生一个出队编号的序列 (一)约瑟夫问题-创建环形链表的思路图解 (二)约瑟夫问题-小孩出圈的思路分析图 package linkedlist; public class Josepfu { public static void main(String[] args) { //测试构建环形链表与显示环形链表是否正确 CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList(); circleSingleLinkedList.addBoy(5);//加入五个节点 circleSingleLinkedList.showBoy(); //测试小孩出圈是否正常 circleSingleLinkedList.countBoy(1, 2, 5); } } //创建环形的单向链表 class CircleSingleLinkedList{ //创建first节点 private Boy first=new Boy(-1); //添加节点构建成环形链表 public

约瑟夫问题

泄露秘密 提交于 2019-11-30 06:35:15
概念介绍   有同学想了解约瑟夫问题,今天它来了!直接进入主题,什么是约瑟夫问题? 约瑟夫问题:N个人围成一圈,从约定编号为K的人开始报数,第M个将被杀掉,依次类推,最后剩下一个,其余人都将被杀掉 。   直接上图展示, 初始化状态: 假设n=6,总共有6个人,k=1,从第一个人开始报数,m=5,每次数五个 。    第一次报数:从一号开始,数五个数,1-2-3-4-5,数完五个数,五号被杀死,第一次报数后,剩余人数如下 。       第二次报数: 从被杀死的五号的下一位开始报数,也就是六号,数五个数,6-1-2-3-4,数数完毕,四号被杀死,第二次报数后,剩余人数如下 。       第三次报数: 从被杀死的四号的下一位开始报数,同样是六号,数五个数,6-1-2-3-6,数数完毕,六号被杀死,第三次报数后,剩余人数如下 。       第四次报数: 从被杀死的六号的下一位开始报数,也就是一号,数五个数,1-2-3-1-2,数数完毕,二号被杀死,第四次报数后,剩余人数如下 。       第五次报数: 从被杀死的二号的下一位开始报数,也就是三号,数五个数,3-1-3-1-3,数数完毕,三号被杀死,只剩下一号,Game Over!    代码实现   实现思路:用单向循环链表来表示圈,将人杀死后修改链表上的节点即可。   第一步:构建节点上对象。 1 class Person {