约瑟夫环问题
2016-06-20 10:26
274 查看
[size=medium]最近研究约瑟夫环,却发现竟然有好多简单解法,过去基本都是模拟循环链表进行输出。
约瑟夫问题是:大家共有n个人(编号0--n-1)围成一圈,从0开始报数,数到第m的人出圈(这里模拟的是2),求最后幸运者序号??
现在直接贴出每种解法的代码:
1.模拟循环链表[/size]
[size=medium]2.模拟游戏过程复杂度比较大。下面这种解法更加简洁[/size]
参考文章为:http://blog.csdn.net/ericchan1986/article/details/5751677
约瑟夫问题是:大家共有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
相关文章推荐
- UVALive 3882 And Then There Was One 约瑟夫环问题
- 【算法题目】约瑟夫环问题
- 约瑟夫环问题(结构体指针实现)
- 约瑟夫环问题——链表
- PHP实现的基于单向链表解决约瑟夫环问题示例
- 约瑟夫环问题
- java实现约瑟夫环问题,百度百科约瑟夫环java代码有问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题---n个人,没弟k个剔除,最后一个元素是多少
- 约瑟夫环的问题
- 约瑟夫环问题 (用循环链表解决)
- HDU 2925 Musical Chairs(约瑟夫环问题)
- 约瑟夫环问题(结构体指针实现)
- 约瑟夫环问题
- 一步一步写算法:约瑟夫环问题
- php解决约瑟夫环的问题
- 利用循环链队列求解约瑟夫环问题(…
- 约瑟夫环问题
- 线性表_循环链表(增减删查 + 约瑟夫环问题 代码实现 )