洛谷P1996 约瑟夫问题

18 阅读1分钟

P1996 约瑟夫问题

题目描述

个人围成一圈,从第一个人开始报数,数到 的人出列,再由下一个人重新从 开始报数,数到 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 名小朋友,而该题是全部出圈。

输入格式

输入两个整数

输出格式

输出一行 个整数,按顺序输出每个出圈人的编号。

输入输出样例 #1

输入 #1

10 3

输出 #1

3 6 9 2 7 1 8 5 10 4

说明/提示

思路

先分析样例输入10 3,就是说10个小朋友轮流报数,输出报到3的人的编号,所以要先给小朋友编号1,2,3,4,5,6,7,8,9,10(初始队列),每个数字代表一个小朋友,再用一个变量res表示每个小朋友喊道的数字,编号1喊1,喊完不对去队尾,编号2喊2,喊完不对去队尾,编号3喊3,编号3对了出列,可以直接输出,或用一个数组记录最后统一输出,此时编号4就成为了队头,再从1喊起4,5,6,7,8,9,10,1,2(现在的队列),直至全部出列(队列为空)。

代码实现

package LAN;
import java.util.*;
public class duiliedemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Queue<Integer> q = new LinkedList<>();
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int res = 0;
		for(int i=1;i<=n;i++) {
			q.add(i);
		}
		while(!q.isEmpty()) {
			res++;
			if(res == m) {
				System.out.print(q.poll() + " ");
				res = 0;
			}
			else q.add(q.poll());
		}

	}

}