约瑟夫环问题

简介:

问题描述:假设有N个小孩按照序号1,2,,,N围坐成一圈,从第一个小孩开始报数,每次报到n的人退出,接着从下一个人重新开始从1开始报数,下一次再报到n的人退出,求最后一个留下的人;

数组实现:

复制代码
public class huan {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String[] s = new String[]{"0a","1b","2c","3d","4e","5f","6g","7h","8i","9j","10k","11l","12m","13n","14o","15p"};
        int k = 3;
        while(s.length != 0){
            int i = 1;
            while(i <= 2){
                if(++k > s.length-1) {//循环n次的时候,每次递增时进行下表越界判断   或者k=k%(s.length)
                    k = 0;
                }
                if(s[k] != null) {
                    i++;
                }
            }
            System.out.print(s[k] + ' ');
            s[k] = null;
        }
    }
}
复制代码

输出:5f 7h 9j 11l 13n 15p 1b 3d 6g 10k 14o 2c 8i 0a 12m 4e 

 

循环链表实现:

复制代码
package com.iteye.ljmdbc7a;

import java.util.Scanner;

/**
 * 循环列表的Java实现,解决约瑟夫环问题
 * @author LIU
 *
 */
public class LinkedList
{
    //定义结点,必须是static
    static class Node
    {
        int data;
        Node next;
        Node(int arg1)
        {
            this.data = arg1;
        }
    }
    public static void main(String[] args)
    {
        int n = 0,m = 0;//定义总人数n,和出圈数字m
        //输入n和m
        System.out.println("输入总人数n,出圈数字m");
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        
        //初始化循环列表,头结点first和尾结点p
        Node first = new Node(1);
        first.next = first;
        Node p = first;
        for(int i=2; i<=n; i++)
        {
            Node temp = new Node(i);
            temp.next = p;
            p.next = temp;
            p = p.next;
        }
        p.next = first;//尾接头形成循环链表(p为尾结点)
        
        //执行出圈操作
        System.out.println("出圈顺序为:");
        while(p != p.next)
        {
            //下面for循环后,p是第m个结点的前一个结点
            for(int i=1; i<m; i++)
                p = p.next;
            //删除第m个结点
            System.out.print(p.next.data+" ");
            p.next = p.next.next;
        }
        System.out.print("\n幸运者是:"+p.data);
    }
    
}
复制代码

 



本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4481137.html,如需转载请自行联系原作者
相关文章
NowCoder | 环形链表的约瑟夫问题
NowCoder | 环形链表的约瑟夫问题
|
9月前
|
存储 算法
|
5月前
约瑟夫环问题的几种解法
约瑟夫环问题的几种解法
74 0
|
6月前
|
算法
约瑟夫环问题(三种方法)
约瑟夫环问题(三种方法)
94 0
|
9月前
|
Java
(五)Java数据结构之循环链表解决约瑟夫(Josephus)环问题
(五)Java数据结构之循环链表解决约瑟夫(Josephus)环问题
65 0
|
10月前
|
算法 索引 Python
细究“约瑟夫环”
细究“约瑟夫环”
73 0
|
11月前
约瑟夫环问题
使用queue<int>q记得加上头文件#include<queue>
55 0
约瑟夫环
题目: 已知n个人(以编号1,2,3--n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人有出列;以此规律重复下去,知道圆桌周围的人全部出列。输出出列顺序和最后剩下的人。
74 0

热门文章

最新文章