码迷,mamicode.com
首页 > 其他好文 > 详细

约瑟夫的幸存者问题

时间:2015-06-11 19:34:58      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:


问题描述:

         n个人编号为1~n,围成一个圈,从第一个人开始报数,123123。。。,报到3的人被踢出,如此循环,直到最后剩下一个人,请问这个人的编号是多少??


方法一:数组解法


import java.util.Scanner;


public class Joseph {

	int[] arr;
	Joseph(int e) {
		arr = new int[e];
	}
	public static void main(String[] args) {
		System.out.print("请输入人数: ");
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		Joseph j = new Joseph(num);
		for(int i=1; i<=num; i++) {
			j.arr[i-1] = i;
		}
		j.cal();

	}
	
	void cal() {
		int count = 0;
		int i = 0;
		int sum = 0;
		while(count != arr.length - 1) {
			if(arr[i] != 0) {
				sum++;
				if(sum == 3) {
					count ++;
					arr[i] = 0;
					sum = 0;
				}
			}
			if(i == arr.length - 1) {
				i = 0;
			} else {
				i++;
			}
		}
		
		
		for(i=0; i<arr.length; i++) {
			if(arr[i] != 0) {
				System.out.println("幸存者是: " + arr[i] + "号");
			}
		}
	}

}


方法二:循环单链表解法


import java.util.Scanner;


public class Joseph {

	Node head;
	Joseph(int e) {
		head = new Node();
		Node p = head;
		for(int i=1; i<=e; i++) {
			Node n = new Node(i);
			p.next = n;
			p = n;
		}
		p.next = head.next;
		head = head.next;
	}
	
	void display() {
		Node p = head;
		while(p.next != head) {
			System.out.print(p.data + "->");
			p = p.next;
		}
		System.out.println(p.data);
	}
	public static void main(String[] args) {
		System.out.print("请输入人数: ");
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		Joseph j = new Joseph(num);
	
		j.display();
		j.cal();

	}
	
	void cal() {
		
		Node p = head;
		int sum = 0;
		while(p.next != p) {
	
			sum++;
			if(sum == 3) {
				
				Node pre = pre(p);
				System.out.println("删除 " + p.data + "号");
				pre.next = pre.next.next;
				
				sum = 0;
			} 
			p = p.next;

		}

		System.out.println("幸存者是: " + p.data + "号");	
	}
	
	Node pre(Node p) {
		Node pre = p;;
		while(pre.next != p) {
			pre = pre.next;
		}
		
		return pre;
	}

}

class Node {
	int data;
	Node next;
	Node(){}
	Node(int e) {
		data = e;
	}
}

结果:

请输入人数: 9
1->2->3->4->5->6->7->8->9
删除 3号
删除 6号
删除 9号
删除 4号
删除 8号
删除 5号
删除 2号
删除 7号
幸存者是: 1号



约瑟夫的幸存者问题

标签:

原文地址:http://blog.csdn.net/qhairen/article/details/46458997

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!