class Link1{
int data;
Link1 next;
public Link1(int i){
this.data=i;
}
}
class CycleList1{
Link1 first=null;
int len=0;
Link1 temp=null;
int m=0;
int[] array=null;
public void setLen(int len) {
this.len = len;
}
public void setM(int m) {
this.m = m;
}
public void setArray(int[] array) {
this.array = array;
}
//创建循环链表
public void createlist(){
for(int i=0;i<array.length;i++){
if(i==0){
Link1 link=new Link1(array[i]);
this.first=link;
this.temp=link;
}else{
if(i==array.length-1){
Link1 link=new Link1(array[i]);
temp.next=link;
temp=link;
temp.next=this.first;
}else{
Link1 link=new Link1(array[i]);
temp.next=link;
temp=link;
}
}
}
}
//开始操作
public ArrayList<Integer> play(){
ArrayList<Integer> al=new ArrayList<Integer>();
temp=this.first;
while(len!=0){
for(int i=1;i<m;i++){
temp=temp.next;
}
m=temp.data;
al.add(m);
//System.out.print(m);
Link1 temp2=temp;
while(temp2.next!=temp){
temp2=temp2.next;
}
temp2.next=temp.next;
temp=temp.next;
len--;
}
return al;
}
//显示循环链表
public void show(){
Link1 temp=this.first;
do{
System.out.print(temp.data+" ");
temp=temp.next;
}while(temp!=this.first);
}
}
约瑟夫问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。
试设计一个程序,求出出列值。
利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号。
运行时间限制: 无限制
内存限制: 无限制
输入: 一串以空格间隔开的数字
第一个数字为环内人数 n < 10
第二个数字为初始密码 m < 10
后面的为每个人的密码值,密码值<10
输出: 出列顺序,以空格间隔开
样例输入: 6 3 6 5 4 3 2 1
样例输出: 3 1 4 2 5 6
代码如下:
package com.compare;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashSet;
public class YueSeFuProblem {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
getresult("6 3 6 5 4 3 2 1");
}
public static void getresult(String input){
String[] array=input.split(" ");
int len=Integer.parseInt(array[0]);
int[] array1=new int[len];
int m=Integer.parseInt(array[1]);
for(int i=2;i<array.length;i++){
array1[i-2]=Integer.parseInt(array[i]);
}
LinkedList2 list=new LinkedList2();
list.setLen(len);
list.setM(m);
list.setArray(array1);
list.createlist();
LinkedHashSet<Integer>set=list.play();
Iterator<Integer> iter=set.iterator();
while(iter.hasNext()){
int d=iter.next();
System.out.print(d+" ");
}
}
}
class Link2{
int data;
Link2 next;
public Link2(int i){
this.data=i;
}
public void show(){
System.out.print(this.data+" ");
}
}
class LinkedList2{
int len=0;
int m=0;
int[] array=null;
Link2 first=null;
Link2 temp=null;
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
public void setLen(int len) {
this.len = len;
}
public void setM(int m) {
this.m = m;
}
public void setArray(int[] array) {
this.array = array;
}
public void createlist(){
for(int i=0;i<len;i++){
if(i==0){
Link2 link=new Link2(i+1);
first=link;
temp=link;
map.put(i+1, array[i]);
}else if(i==len-1){
Link2 link=new Link2(i+1);
temp.next=link;
temp=link;
temp.next=this.first;
map.put(i+1, array[i]);
}else{
Link2 link=new Link2(i+1);
temp.next=link;
temp=link;
map.put(i+1, array[i]);
}
}
}
public LinkedHashSet<Integer> play(){
LinkedHashSet<Integer> set=new LinkedHashSet<Integer>();
temp=this.first;
while(len!=0){
for(int i=1;i<m;i++){
temp=temp.next;
}
set.add(temp.data);
m=map.get(temp.data);
Link2 temp2=temp;
while(temp2.next!=temp){
temp2=temp2.next;
}
temp2.next=temp.next;
temp=temp.next;
len--;
}
return set;
}
}