约瑟夫的幸存者问题
来源:互联网 发布:什么手机电视直播软件 编辑:程序博客网 时间: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
- 约瑟夫的幸存者问题
- 幸存者:约瑟夫环问题
- 约瑟夫问题.快速求幸存者
- 2015072703 - 孤独的幸存者
- 简单的约瑟夫问题
- 约瑟夫问题的求解
- 约瑟夫问题的实现
- 约瑟夫问题的解法
- 约瑟夫问题的代码
- 约瑟夫环的问题
- 约瑟夫问题的实现
- 约瑟夫问题的解法
- 约瑟夫环的问题
- 约瑟夫环的问题
- 约瑟夫环的问题
- 约瑟夫环的问题
- 啰嗦的约瑟夫问题
- 约瑟夫的数论问题
- SpringMVC拦截器中通过反射得到Controller方法注解时ClassCastException解决方案
- js 身份证号验证
- 容斥原理 && 欧拉函数 && 抽屉原理 总结
- 【ITOO】--不知道多线程你就就out了
- iOS5 strong, weak, unsafe_unretained ARC
- 约瑟夫的幸存者问题
- Android定位功能
- 关于iOS Tabbar的一些设置
- java web servlet
- 黑马程序员——基础篇——多线程
- mysql获取插入后ID
- 判断邮件地址是否是真实地址
- MFC完全自绘Tab控件,支持图片背景
- autolayout - sizeClass 学习 ~ three