丢手帕问题-约瑟夫问题

来源:互联网 发布:php源码 鲶鱼 编辑:程序博客网 时间:2024/04/29 01:52
1 问题描述:

      n个人围成一个圈,编号为1~n,从第一号开始报数,报到a的倍数的人离开,一直数下去,直到最后只有一个人,求此人编号。

2 解决思路:
    使用一维数组,初始化数组的大小为n,数值全为1
    初始化计数器为n,
    循环数组,如果这个这个数是a的倍数,把当前的数组数值为零,计数器减一
    直到 计数器等于1
    遍历数组找到那个不是0的数组输出它的下标

3参考代码:

/**
 * @author Carl
 * @data 2017/10/11
 * */
package com.tiku.sort;

import java.util.Scanner;

public class Josephus {
    //丢手帕问题是约瑟夫问题的一个变种,N个小孩围成一个圈,标号是1到N,从编号为m的小孩开始数数,
    //数到L个小孩退出游戏,然后在开始数L个小孩,最后剩下的小孩获胜
    public static void main(String [] args){
        System.out.println("请输入一个数字:");
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int counter = n;//计数器
        int num = 1; //数数
        int [] array = new int [n];//声明数组
        
        //初始化数组
         for(int i = 0;i<array.length;i++){
            array[i] = 1;
        }
        while(counter > 1){
            for(int j = 0;j<array.length;j++){
                if(array[j] != 0){
                    array[j] = num;
                    if(num%3 == 0){
                        array[j] = 0;
                        counter --;
                        if(counter == 1){
                            break;
                        }
                    }
                    num ++;
                }
            }
        }
        for(int k = 0; k<n; k++){
            if(array[k] != 0){
                System.out.println("胜利的玩家是:" + (k+1));
            }
        }
    }
}


原创粉丝点击