一、Josephu约瑟夫问题

Description

约瑟夫问题:有n个人,按顺时针方向围成一圈(编号从1到n),从第1号开始报数,一直数到m,数到m的人退出圈外,剩下的人再接着从1开始报数。,编程求输入n,m后,输出出圈的序号。

Input

每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:0 0

Output

输出出队的队列

package datastruct.josephu;

public class Josephu {
    public static void main(String[] args) {
        // 首先找到 第一个节点的前一个节点。
        Node head = new Node(1);
        head.addNode(2).addNode(3).addNode(4).addNode(5).addNode(6).addNode(7).addNode(8).next = head;
        jsephuResult(head, 8, 3);
    }

    public static void jsephuResult(Node head, int n, int m) {
        // step 1: 找到第一个节点的前一个节点
        Node temp = head;
        while (temp.next != head) {
            temp = temp.next;
        }
        while (temp.next != temp) {
            for (int i = 0; i < m - 1 && head.next != head; i++) {
                temp = temp.next;
            }
            // output and delete node
            System.out.println(temp.next.value);
            temp.next = temp.next.next;
        }
        System.out.println(temp.value);
    }
}

class Node {
    Node next = null;
    int value;

    Node(int v) {
        value = v;
    }

    Node addNode(int value) {
        Node nextNode = new Node(value);
        this.next = nextNode;
        return nextNode;
    }
}

原文地址:https://www.cnblogs.com/feihu-h/p/12641608.html

时间: 2024-10-28 16:09:54

一、Josephu约瑟夫问题的相关文章

Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)

1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列. 提示: 用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法

JAVA程序设计(13.1)---- 循环 数组 应用复习,约瑟夫环问题

1.今天基本上上课是复习以前的哦 作业约瑟夫环,30个人围成一圈,从一个人开始数数1,下一个人数 2,数到9的就( ^_^ )/~~拜拜,出局,后面一个人继续数1.....问剩下15个人都是基督徒吗?额--不对--剩下15个人都站在什么位置.用一个数组就解决了--初始化都是0,出局的就赋值1,循环到1的时候不计数,每9个0,最后一个0就变成1,直到出局15人. package com.lovo.josephu; /** * 类:约瑟夫环站位 * @author Abe */ public cla

php实现单,双向链表,环形链表解决约瑟夫问题

传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季  http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求不高 但是,如果你开发系统软件,比如(搜索/识别软件[图像,语言识别]/操作系统...)对数学高 建模.大量数学模型. 老师啊啊.我是学C++的.麻烦,谈哈对QT和MFC的看法嘛.前景什么的, 记住 : 打好基础,大有可为! 初中毕业能去传智学习吗? 学习It, 不管是java ,php ,c#,对

双向链表和环形链表(约瑟夫问题)

双向链表 package linkedlist; public class DooubleLinkedListDemo { public static void main(String[] args) { HeroNode2 hero1 = new HeroNode2(1,"宋江","及时雨"); HeroNode2 hero2 = new HeroNode2(2,"卢俊义","玉麒麟"); HeroNode2 hero3 =

一个不简洁的约瑟夫环解法

约瑟夫环类似模型:已知有n个人,每次间隔k个人剔除一个,求最后一个剩余的. 此解法为变种,k最初为k-2,之后每次都加1. 例:n=5,k=3.从1开始,第一次间隔k-2=1,将3剔除,第二次间隔k-1=2,将1剔除.依此类推,直至剩余最后一个元素. 核心思路:将原列表复制多份横向展开,每次根据间隔获取被剔除的元素,同时将此元素存入一个剔除列表中.若被剔除元素不存在于剔除列表,则将其加入,若已存在,则顺势后移至从未加入剔除列表的元素,并将其加入.如此重复n-1次.面试遇到的题,当时只写了思路,没

【c语言】数据结构(约瑟夫生者死者游戏的问题)

约瑟夫生者死者游戏:30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分:因此船长告诉大家,只有将全船一半的旅客投入海中,其余人才能幸免遇难.无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人开始,依次报数,数到第9个人,就把他投入大海中,然后从他的下一个人开始从1数起,数到第9个人,再将她投入大海,如此循环,直到剩下15个人乘客为止.问哪些位置是将被扔到大海的位置. 解法有许多种,可以用数组,应为涉及到删除操作,数组(顺序线性表)比较麻烦,但不必要删除,只需要给跳船的人(元素

算法系列:约瑟夫斯问题

约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环. 有{\displaystyle n}个囚犯站成一个圆圈,准备处决.首先从一个人开始,越过{\displaystyle k-2}个人(因为第一个人已经被越过),并杀掉第k个人.接着,再越过{\displaystyle k-1}个人,并杀掉第k个人.这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着. 问题是,给定了{\displaystyle n}和{

ytu 1067: 顺序排号(约瑟夫环)

1067: 顺序排号Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 31  Solved: 16[Submit][Status][Web Board] Description 有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位. Input 初始人数n Output 最后一人的初始编号 Sample Input 3 Sample Output 2 HINT Source freepro

约瑟夫环 C语言 单循环链表

/*---------约瑟夫环---------*/ /*---------问题描述---------*/ /*编号为1,2,-,n的n个人围坐一圈,每人持一个密码(正整数). 一开始任选一个正整数作为报数上限值m, 从第一个人开始自1开始顺序报数,报到m时停止. 报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数, 如此下去,直至所有人全部出列为止.试设计一个程序求出列顺序.*/ /*---------问题分析---------*/ /*n个人围坐一圈,且不断有人出列,即频繁