约瑟夫的幸存者问题
2015-06-11 16:20
274 查看
问题描述:
n个人编号为1~n,围成一个圈,从第一个人开始报数,123123。。。,报到3的人被踢出,如此循环,直到最后剩下一个人,请问这个人的编号是多少??
方法一:数组解法
方法二:循环单链表解法
结果:
方法三:队列解法
or
结果:
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号
方法三:队列解法
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号
相关文章推荐
- js 身份证号验证
- Markdown语法
- wordpress源码解析-目录结构-文件调用关系(1)
- 《编程珠玑》阅读小记(6) — 算法设计技术
- 关于android开发中出现中文乱码
- SpringMVC拦截器中通过反射得到Controller方法注解时ClassCastException解决方案
- 专治懒癌100年,疗效嗷嗷好!
- 容斥原理 && 欧拉函数 && 抽屉原理 总结
- android 定义颜色color时6位或8位值的区别
- gRPC 的route_guide例子
- 5-4图层的不透明度
- SAT数学考试必背公式---三角函数
- Rectangle Area
- gethostbyname用法
- 数据挖掘学习笔记之CART树
- openssl编程之服务端
- 记AWS+Drupal Happy Hour 150610—— AWS Active 分享
- Python学习笔记4
- Linux-shell下的作业管理
- Button事件实现方法的总结