约瑟夫的幸存者问题

来源:互联网 发布:什么手机电视直播软件 编辑:程序博客网 时间:2024/05/16 01:36


问题描述:

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

结果:

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


方法三:队列解法


import java.util.LinkedList;import java.util.Scanner;public class Joseph {LinkedList<Integer> list = new LinkedList<Integer>();Joseph(int e) {for(int i=1; i<=e; i++) {list.add(i);}}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.cal();}void cal() {int sum = 0;while(list.size() != 1) {sum++;if(sum == 3) {int e = list.removeFirst();System.out.println("删除 " + e + "号");sum = 0;} else {int e = list.removeFirst();list.add(e);}}System.out.println("幸存者是: " + list.get(0) + "号");}}


or


import java.util.Scanner;public class Joseph {LinkedQueue lq = new LinkedQueue();Joseph(int e) {for(int i=1; i<=e; i++) {lq.enQueue(i);}}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.lq.display();j.cal();}void cal() {int sum = 0;while(lq.length() != 1) {sum++;if(sum == 3) {int[] e = lq.deQueue();System.out.println("删除 " + e[1] + "号");sum = 0;} else {int[] e = lq.deQueue();lq.enQueue(e[1]);}}System.out.println("幸存者是: " + lq.qh.front.data + "号");}}class LinkedQueue {QueueHead qh = new QueueHead();boolean empty() {return qh.front == null;        //or qh.rear == null}void enQueue(int e) {QNode q = new QNode(e);if(empty()) {qh.front = q;qh.rear = q;} else {qh.rear.next = q;qh.rear = q;}}int[] deQueue() {int[] arr = new int[2];if(qh.rear == null) {arr[0] = 0;return arr;}arr[0] = 1;arr[1] = qh.front.data;if(qh.front.next == null) {qh.front = qh.rear = null;} else {qh.front = qh.front.next;}return arr;}int length() {int sum = 0;QNode q = qh.front;while(q != null) {sum++;q = q.next;}return sum;}void display() {QNode p = qh.front;while(p != null) {if(p.next == null) {System.out.println(p.data);} else {System.out.print(p.data + "->");}p = p.next;}}}class QNode {int data;QNode next;QNode(){}QNode(int e) {data = e;}}class QueueHead {QNode front;QNode rear;public QueueHead() {}}


结果:

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




0 0
原创粉丝点击