您的位置:首页 > 其它

约瑟夫环问题

2016-06-20 10:26 274 查看
[size=medium]最近研究约瑟夫环,却发现竟然有好多简单解法,过去基本都是模拟循环链表进行输出。
约瑟夫问题是:大家共有n个人(编号0--n-1)围成一圈,从0开始报数,数到第m的人出圈(这里模拟的是2),求最后幸运者序号??
现在直接贴出每种解法的代码:
1.模拟循环链表[/size]

import java.util.Scanner;
class Node {
Node next;
int data;
Node(int data){
this.data=data;
}
}
public class HuaWei2{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int total = scan.nextInt();
Node first = new Node(0);
Node pointer = first;
//将输入的值依次插入
for(int i=1;i<total;i++){
pointer.next = new Node(i);
pointer = pointer.next;
}
//插入结束后将尾指针指向头指针
pointer.next=first;
//指针从新指向头结点,也可以新建Node pointer1 = first
pointer = first;
//i<3是因为我们从头结点开始,一直到需要删除结点的头一个节点。如果i=1,那么应该while(i<2);
while(pointer!=pointer.next){
int i = 2 ;
while(i<3){
pointer = pointer.next;
i++;
}
System.out.println("删除的节点是:"+pointer.next.data);
//将节点删除,并且将指针指向下一个开始的地方
pointer.next = pointer.next.next;
pointer = pointer.next;
}
System.out.println("最后的幸运节点是:"+pointer.data);
}
}
}

[size=medium]2.模拟游戏过程复杂度比较大。下面这种解法更加简洁[/size]
int Yuesefu(int M, int N) //总人数 M ,数到第 N 个排除。K为从0开始对应的最后一个幸运人的下标,所以本题N=3;k=(k+3)%i

{

int k=0;

for (int i = 2; i <= M; i++)

k = (k + N) % i;


}

参考文章为:http://blog.csdn.net/ericchan1986/article/details/5751677
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: