约瑟夫问题

Java 数组 约瑟夫问题

白昼怎懂夜的黑 提交于 2019-12-27 06:04:05
最开始是这么写的: int[] list = new int[10];//总人数 int x = 10;//记录数组中还有几个人活人 //建立输入流确定那个犯人死亡 Scanner scan = new Scanner(System.in); //给犯人编号 for (int i = 0; i < list.length; i++) { list[i] = i + 1; } //输入犯人列表 for (int i = 0; i < list.length; i++) { System.out.print(list[i]+" "); } //当仅有一人活着的时候游戏结束 while (x != 1) { System.out.println("请输入想要打死的犯人"); //每次输入先要打死的犯人 int n = scan.nextInt(); if (list[n-1]==0){ //如果犯人已经被打死,那么重新输入 System.out.println("该犯人已经被打死,请重新输入"); continue; } list[n-1] = 0; x--;//人数减少1 if (x==1){ //如果只剩下最后一个人 System.out.println("最后活下来的人是:"); } //输入还有哪些序号的人还活着 for (int i = 0; i < list.length;

约瑟夫问题升级版

纵然是瞬间 提交于 2019-12-27 01:48:24
约瑟夫问题升级版 编号为1~N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数,可以自由输入),开始人选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报道M时停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1报数,如此下去,直至所有人全部出列为止。 分析: 升级版的约瑟夫问题,就是在每个人的手中拿了一个密码,当这个人死了之后,拿着这个手中的密码,进行下一次剔除。 如上图所示,p 第一个拿到的是 3 ,则从头开始第 3 个人剔除,依次这样进行下去,直到所有人被剔除。 代码实现: class JosephusLoopUpper { private Node head ; //头指针 private Node rear ; //尾指针 private int size ; private int M ; //每个人手中所拿的密码数字 public JosephusLoopUpper ( ArrayList < Integer > list , int M ) { //创建一个给定人个数的环 head = new Node ( list . get ( 0 ) , 0 , null ) ; //创建第一个点 并将尾指向头形成一个环 rear = head ; rear . next = head ; for ( int i = 1

约瑟夫问题代码实现

此生再无相见时 提交于 2019-12-26 07:58:47
问题:设编号1,2,·····n的n个人围成一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的人继续出列,以此类推,直到所有人出列为止,由此产生一个出队编号的序列。 主函数测试代码: public static void main(String[] args){ Scanner scanner=new Scanner(System.in); //创建要给链表 CirSingleLinkedList cirSingleLinkedList=new CirSingleLinkedList(); //1.添加数据 cirSingleLinkedList.addBoy(5); //2.显示数据 System.out.println("环形单链表内的数据为:"); cirSingleLinkedList.list(); //3.出圈顺序(2->4->1->5->3) cirSingleLinkedList.countBoy(1,2,5); } 单链表类: class CirSingleLinkedList{ //先初始化一个头节点,头节点不能动,不存放具体的数据 private Boy first=new Boy(-1); public void countBoy(int startNo,int countNum,int nums){

古老而简单的约瑟夫问题

天大地大妈咪最大 提交于 2019-12-26 04:45:48
约瑟夫问题的传说: 著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。 抽象出来问题分析与算法设计: 已知n个人(以编号1、2、3~~n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,他的下一个人又从1开始报数,数到m的那个人出列,依次规律重复下去,直到圆桌周围的人全部出列。   例如:n = 9, k = 1, m = 5   【解答】   出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8。 程序代码: 很明显这个问题用循环连接即可解决。 1 #include <iostream> 2 using namespace std; 3 4 //定义节点结构体 5 struct node{ 6 int data; 7 struct node *link; 8 }; 9 10 void Josephus(int n, int k, int

c实现数据结构中约瑟夫问题

本秂侑毒 提交于 2019-12-25 13:02:13
//约瑟夫问题,已知n个人,围坐在一个圆桌周围,编号为k的人从1开始报数,数到m的那个人出列,他的下一个人从1开始继续报数,疏导m的那个人出列,直到圆桌周围人全部出列 #include <stdio.h> #include <stdlib.h> #define MaxSize 100 #define ElementType int typedef struct node{ ElementType data; struct node *link; }LNode,*LinkList; void JOSEPHU(int n,int k,int m); int main(){ int n,k,m; printf("%\ninput n,k,m"); //输入链结点总数n,报数的起始位置k和报数m scanf("%d%d%d",&n,&k,&m); JOSEPHU(n,k,m); } //约瑟夫函数 void JOSEPHU(int n,int k,int m){ //建立一个无头结点的非循环链表 LinkList p,r,list; list = NULL;//创建一个空链表 ElementType a; for(int i=1;i<=n;i++){ printf("请输入第%d个数据",i); scanf("%d",&a); p = (LinkList) malloc(sizeof

约瑟夫问题

跟風遠走 提交于 2019-12-24 12:08:36
问题陈述: 据说著名的犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个山洞里,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人围成一个圆圈,由第1个人开始报数,每报数到第三人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。 然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个和第31个位置,于是逃过了这场死亡游戏。 问题解法: 约瑟夫问题 可用代数分析来求解,此处将这个问题扩大,假设现在您有m个朋友不幸参与了这个游戏,您要如何保护您与您的朋友? 其实只要画两个圆圈就可以让自己与朋友免于死亡游戏,这两个圆圈内圈是排列顺序,而外圈是自杀顺序,如下图所示: 使用程式来求解的话,只要将阵列当做环装来处理就可以了,在阵列中由计数1开始,每找到三个无资料区就填入一个计数,直到计数达41为止,然后将阵列由索引1开始出,就可以得知每个位置的自杀顺序,这就是约瑟夫排列,41个人而报数3的约瑟夫排列如下所示: 14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12 22 33 13 29 23

约瑟夫问题(最简)

若如初见. 提交于 2019-12-22 11:08:12
1.问题描述 约瑟夫环问题的基本描述如下:已知 n 个人(以编号1,2,3... n 分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,要求找到最后一个出列的人或者模拟这个过程。 #include<iostream> using namespace std; int main() { int n,m,k,ans=0; cin>>n>>k>>m; for(int i = 2; i <= n; i++)ans = (ans + m) % i; cout<<(ans+k)%n<<endl; } 来源: CSDN 作者: 咖喱东东 链接: https://blog.csdn.net/qq_39410381/article/details/103650806

约瑟夫问题(单向循环对列)

旧时模样 提交于 2019-12-18 03:57:42
题目描述: 题目解析: 该题是是基于单向循环队列实现的,其实简单点来说就是隔两个结点删一个结点,直至剩下两个结点,然后把两个结点中存储的数据输出。 解题步骤: 1.定义结点内部类,用于描述结点 2.创建关于创建链表的构造函数,通过for循环把结点位置一确定,每个结点的数据域中存储该结点的位置 3.编写函数删除指定位置的元素,将最终剩余的两个节点的位置一同放入一个线性表中,返回该线性表。如下图所示删除: 完整代码: package Ds02 . 动态链表 ; import DS01 . 动态数组 . ArrayList ; import DS01 . 动态数组 . List ; //约瑟夫环 真实头结点 循环一类的都是基于循环链表 public class JosephusLoop { private Node head ; private Node rear ; private int size ; public JosephusLoop ( int count ) { head = new Node ( 1 , null ) ; rear = head ; rear . next = head ; for ( int i = 0 ; i <= count ; i ++ ) { rear . next = new Node ( i , rear . next ) ; //尾插法

#2019120700020 约瑟夫问题七问

冷暖自知 提交于 2019-12-07 08:09:26
1.基本约瑟夫问题 题目描述 \(n\) 个人( \(n\le 100\) )围成一圈,从第一个人开始报数,数到 \(m\) 的人出列,再由下一个人重新从 \(1\) 开始报数,数到 \(m\) 的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号. 输入格式 \(n m\) 输出格式 出圈的编号 样例输入 10 3 样例输出 3 6 9 2 7 1 8 5 10 4 说明 \(m, n \le 100\) 2 题意描述 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 输入 \(n,k,m\) 输出 按顺序输出出圈人的编号 样例输入 9 1 5 样例输出 5 1 7 4 3 6 9 2 8 3 约瑟夫问题是个有名的问题: \(N\) 个人围成一圈,从第一个开始报数,第 \(M\) 个将被杀掉,最后剩下一个,其余人都将被杀掉。例如 \(N=6\) , \(M=5\) ,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。 假定在圈子里前 \(K\) 个为好人,后 \(K\) 个为坏人,你的任务是确定这样的最小 \(M\) ,使得所有的坏人在第一个好人之前被杀掉。 4 n个人排成一圈。从某个人开始

洛谷 P1996 约瑟夫问题

我是研究僧i 提交于 2019-12-06 04:24:51
题目背景 约瑟夫是一个无聊的人!!! 题目描述 n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号. 输入格式 n m 输出格式 出圈的编号 输入输出样例 输入 #1 复制 10 3 输出 #1 复制 3 6 9 2 7 1 8 5 10 4# include <cstdio> # include <iostream>using namespace std;struct node{ int data; node *next;};int main(){ int x,n,m,t=0; cin>>m>>n;//if(m==0&&n==0) break; node *head,*tail,*listnode; head=tail=NULL;//初始链表为空 for(int i=1;i<=m;i++) { listnode=new node;//new为C++动态分配内存的运算符,分配一个结点 listnode->data=i;//新结点数据域赋值 listnode->next=head;//新结点指针域赋值 if(head==NULL) head=tail=listnode;//链表为空,插入第一个结点 else { tail->next=listnode;/