本文主要是介绍poj3750约瑟夫环,循环队列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description
有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。
Input
第一行输入小孩的人数N(N<=64)
接下来每行输入一个小孩的名字(人名不超过15个字符)
最后一行输入W,S (W < N),用逗号”,”间隔
Output
按人名输出小孩按顺序出列的顺序,每行输出一个人名
Sample Input
5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2,3
Sample Output
Zhangsan
Xiaohua
Xiaoming
Xiaowang
Lisi
import java.io.BufferedInputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner cin = new Scanner( new BufferedInputStream(System.in) ) ;PrintWriter cout = new PrintWriter(System.out) ;List<String> answer = new Solve(cin.nextInt() , cin).todo() ;for(String name : answer){cout.println(name) ;}cout.flush() ; cout.close() ;}}class Node{String name ;Node pre , next ;Node(){pre = next = null ;}
}class Solve{Node head ; int w , s ; public Solve(int n , Scanner cin) {make(n) ;Node now = head ;for(int i = 1 ; i <= n ; i++){now.name = cin.next() ;now = now.next ;}String[] p = cin.next().split(",") ;w = Integer.parseInt(p[0]) ; s = Integer.parseInt(p[1]) ; } void make(int n){head = new Node() ;Node now = head ;for(int i = 1 ; i < n ; i++){now.next = new Node() ;now.next.pre = now ;now = now.next ;}now.next = head ;head.pre = now ;}Node move(Node now , int step){for(int i = 1 ; i <= step ; i++) now = now.next ;return now ;} Node delete(Node now){now.next.pre = now.pre ;now.pre.next = now.next ;return now.next ; }List<String> todo(){List<String> answer = new ArrayList<String>() ; Node now = move(head , w-1) ;while(now.next != now){now = move(now, s-1) ;answer.add(now.name) ;now = delete(now) ;}answer.add(now.name) ;return answer ; }}
这篇关于poj3750约瑟夫环,循环队列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!