论坛首页 综合技术论坛

用JAVA 解决 约瑟夫环问题的两种办法

浏览 1190 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-12-16  

问题:n = 7人坐在一圈,从1开始报数,报到m = 20的人出列,将他的密码作为新的m,直到所有的人出列。密码依次为:3、1、7、2、4、8、4。

使用JAVA数组实现:

public static void main(String[] args) {
	int m = 20;
	Character[] people = {'A','B','C','D','E','F','G'};
	int length = people.length;
	int num = length;
	Integer[] password = {3,1,7,2,4,8,4};
	int index = 0;
	int position = 1;
	while (num > 0) {
		if (m == position) {
			num --;
			System.out.print(people[index]);
			System.out.print('\t');
			people[index] = null;
			position = 0;
			m = password[index];
		}
		index = (++index % length);
		if (people[index] != null) {
			position ++;
		}
	}
}

 使用LinkedList实现:

public static void main(String[] args) {
	char[] p = {'A','B','C','D','E','F','G'};
	int[] w = {3,1,7,2,4,8,4};
	List<Character> people = new LinkedList<Character>();
	List<Integer> password = new LinkedList<Integer>();
	for (int i = 0; i < w.length; i++) {
		people.add(p[i]);
		password.add(w[i]);
	}
	
	int index = 0 ;
	int position = 1;
	int num = people.size();
	int m = 20;
	while (num > 0) {
		if (position == m) {
			System.out.print(people.remove(index));
			System.out.print('\t');
			m = password.remove(index);
			num --;
			position = 1;
			if (index >= people.size()) {
				index = 0;
			}
		} else {
			if (num > 0) {
				if (index >= people.size() -1) {
					index = 0;
				} else {
					index ++;
				}
				position ++;
			}
		}
	}
}

 上面是我的实现方法。一定还有更好的解决方法。欢迎大家指点。

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics