约瑟夫环问题(JAVA版)
【问题描述】
约瑟夫环问题是,编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码。开始时任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
【测试数据】
标题M的初值为20,n=7,7个人的密码依次为3,1,7,2,4,8,4。则首先出列的人是6号,依次正确的出列顺序应该为6,1,4,7,2,3,5。
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
public class ysf {
public static void main(String[] args) {
Map<Integer, Integer> map =new HashMap<Integer, Integer>();
Scanner in =new Scanner(System.in);
int n=in.nextInt();
in.close();
map.put(1, 3);
map.put(2, 1);
map.put(3, 7);
map.put(4, 2);
map.put(5, 4);
map.put(6, 8);
map.put(7, 4);
int b=1,t=0;
while(t<=7) {
Iterator<Map.Entry<Integer, Integer>> it =map.entrySet().iterator();
while(it.hasNext()) {
Map.Entry<Integer, Integer> entry =it.next();
if(b==n) {
System.out.println(entry.getKey());
t++;
n=entry.getValue();
b=0;
it.remove();
}
b++;
}
}
}
}