约瑟夫环问题

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

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);
		}
	}
}

2.模拟游戏过程复杂度比较大。下面这种解法更加简洁
int Yuesefu(int M, int N) //总人数 M ,数到[b]第 N 个[/b]排除。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

猜你喜欢

转载自w-sl.iteye.com/blog/2306031