约瑟夫环问题思路解读

有n个人,报数m的人出列。输出这n个人的出队顺序

例如:

有8个人,初始序列为 1 2 3 4 5 6 7 8

当m=4时,出列顺序为:4 8 5 2 1 3 7 6

思路:

用一个数组p[ ],存放人的编号,将n个人的编号存到p[0]~p[n-1];

从编号为1,数组为p[0],数组下标为t=0开始循环报数,数到m的人(该人下标为t=(t+m-1)%i)出列,i为数组中剩下的人数。

例如:第一个出列的是4号,它在数组中的下标是3。(0+4-1)%8=3

输出p[t],并将它从数组中删除(即将后面的元素前移一个位置)因此,每次报数的起始位置就是上次报数的出列位置。反复执行直到出列n个人为止。

import java.util.Scanner;

public class D_3_31_4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int m=sc.nextInt();
		int p[]=new int[n] ;
		for(int i=0;i=1;j--)
		{
			t=(t+m-1)%j;
			System.out.print(p[t]+" ");
			for(int k=t+1;k<=j-1;k++)
			{
				p[k-1]=p[k];
			}
		}
	}

}

约瑟夫环问题思路解读_第1张图片

你可能感兴趣的:(数据结构)