这是一个简单的约瑟夫环问题,就是每个人手中的号码都是3,然后人数是固定的41,所要计算的是最后要存活的人应该站在位置。(这是参考别人的设计的,明天附上那书名)
package josephus;
import java.util.*;
public class Easy {
static final int Num =41;
static final int KillMan = 3;
static void Josephus(int alive){
int[] circle = new int[Num];
int count = 1;
int i = 0,pos = -1;
while(count <= Num){
do{
pos = (pos + 1)%Num;
if(circle[pos] == 0){
i++;
}
if(i == KillMan){
i= 0;
break;
}
}while(true);
circle[pos] =count;
System.out.printf("第%d个人自杀!约瑟夫环号为%d\n", pos+1,circle[pos]);
count ++;
}
System.out.printf("这%d要存活要站在的初始位置为:\n",alive);
alive = Num - alive;
for(i = 0;i<Num;i++){
if(circle[i]>alive){
System.out.printf("初始编号为:%d,约瑟夫换编号为:%d\n",i+1,circle[i]);
}
}
}
public static void main(String[] arg){
int alive;
Scanner in = new Scanner(System.in);
System.out.println("输入要存活的人数:");
alive = in.nextInt();
Josephus(alive);
in.close();
}
}
然后这是复杂的约瑟夫环问题,就是每个人手中的号码不一样并且开始的顺序不一样,所以要构造一个循环链表来决解问题,代码和注视如下:
package josephus;
class LinkList{//构造链表
int no;
int psw;
LinkList next;
public LinkList(int no,int psw){
this.no = no;
this.psw =psw;
}
public LinkList(int no,int psw,LinkList next){
this.no = no;
this.psw = psw;
this.next = next;
}
}
public class HardJosephus {
static LinkList head = null,tail = null;
int size = 0;
public void addHead(int i , int psw){
head = new LinkList(i,psw,head);
if(tail == null)
tail =head;
size++;
}
public void addTail(int i,int psw){
tail.next = new LinkList(i,psw);
tail = tail.next;
tail.next = head;
size++;
}
static void Circle(LinkList list,int m){//出列过程
LinkList p ,q;
int i;
q=p=list;
while(q.next != p){//找到首p尾q ,构成循环链表
q=q.next;
}
System.out.println("出列顺序:");
while(p.next != p){//循环出列
for(i = 0;i<m-1;i++){
q= p;//记录出列位置q
p =p.next;//p为q的下一节点
}
q.next = p.next;//将p节点架空
System.out.printf("第%d人出列,其手中的数字为%d\n", p.no,p.psw);//输出
m=p.psw;//将psw复制给m
p=null;//释放 p
p=q.next;
}
System.out.printf("最后一个出列,编号为%d,其手中的数字为%d\n", p.no,p.psw);
}
public static void mian(String[] args){
//TEST
}
}
欢迎拍砖.