日期:2014-05-20 浏览次数:20695 次
public class Josephus { public static void main(String args[]) { if(args.length != 2) //处理参数数目不正确情况 { System.out.println("Please Input a number!"); return; } int i, j, n, m; n = Integer.parseInt(args[0]); m = Integer.parseInt(args[1]); if (n <= 0 || m <= 0) //处理参数值不正确的情况 { System.out.println("Paramter must bigger than zero!"); return; } int a[] = new int[n]; for (i = 0; i < n; i++) a[i] = i + 1; int k = 1; //标识处理第k个离开的人 i = -1; //数组下标,下一个为0,即第一个人 while (true) //k等于n表示只剩下一个人了 { for (j = 0; j < m;) //在圈中数m个人 { i = (i + 1) % n; if (a[i] >0) j++; //a[i] >0表示第i个人还没有离开 } if(k==n) break; System.out.println("No." + a[i] + " is out!"); a[i] = -1; //表示该人离开 k++; } System.out.println("No." + a[i] + " is the winner!"); } } 输入: C:\Documents and Settings\circle\桌面>java Josephus 9 4 输出结果: No.4 is out! No.8 is out! No.3 is out! No.9 is out! No.6 is out! No.5 is out! No.7 is out! No.2 is out! No.1 is the winner!
------解决方案--------------------
java 链表实现:
package com.wayfoon.test; import java.util.LinkedList; import java.util.List; /** * 有M个人,其编号分别为1-M。这M个人按顺序排成一个圈。 * 现在给定一个数N,从第一个人开始依次报数,数到N的人出列, * 然后又从下一个人开始又从1开始依次报数, * 数到N的人又出列...如此循环,直到最后所有人出列为止。 * 输出出列轨迹 * */ public class Tx { //存放M List<String> list = new LinkedList<String>(); //一圈数数完之后,临时存放出列的人 List<String> tmp = new LinkedList<String>(); public Tx(int m) { for (int i = 1; i <= m; i++) { list.add(i + ""); } } /** * 递归 执行主体 * @param start * @param n */ public void start(int start,int n) { int size = list.size(); if (list.size() == 0) { System.out.println("结束!!"); return ; } for (int i = 1; i <= size; i++) { if ((i + start) % n == 0) { System.out.println(list.get(i - 1) + " 出局,"); tmp.add(list.get(i - 1)); } } //在m中删除临时队列的人 for (String str : tmp) { list.remove(str); } //清除list tmp.clear(); //递归 start((size + start) % n,n); } public static void main(String[] args) { long t1=System.currentTimeMillis(); //M=100 Tx tx = new Tx(100); //n=7 tx.start(0,7); System.out.print("花费时间:"); System.out.println(System.currentTimeMillis()-t1); } } 执行结果, 7 出局, 14 出局, 21 出局, 28 出局, 35 出局, 42 出局, 49 出局, 56 出局, 63 出局, 70 出局, 77 出局, 84 出局, 91 出局, 98 出局, 5 出局, 13 出局, 22 出局, 30 出局, 38 出局, 46 出局, 54 出局, 62 出局, 71 出局, 79 出局, 87 出局, 95 出局, 3 出局, 12 出局, 23 出局, 32 出局, 41 出局, 51 出局, 60 出局, 69 出局, 80 出局, 89 出局, 99 出局, 9 出局, 19 出局, 31 出局, 43 出局, 53 出局, 65 出局, 75 出局, 86 出局, 97 出局, 10 出局, 24 出局, 36 出局, 48 出局, 61 出局, 74 出局, 88 出局, 1 出局, 16 出局, 29 出局, 45 出局, 59 出局, 76 出局, 92 出局, 6 出局, 25 出局, 40 出局, 58 出局, 78 出局, 94 出局, 15 出局, 34 出局, 55 出局, 73 出局, 96 出局, 18 出局, 44 出局, 67 出局, 90 出局, 17 出局, 47 出局, 72 出局, 2 出局, 33 出局, 66 出局, 100 出局, 37 出局, 81 出局, 11 出局, 57 出局, 4 出局, 52 出局, 8 出局, 68 出局, 27 出局, 93 出局, 83 出局, 82 出局, 85 出局, 26 出局, 64 出局, 20 出局, 39 出局, 50 出局, 结束!! 花费时间:15
------解决方案--------------------
class OnelinkNode // 单向链表的结点类 { public int data; // 存放结点值 public OnelinkNode next; // 后继结点的引用 public OnelinkNode(int k) // 构造值为k的结点 { data = k; next = null; } public OnelinkNode() // 无参数时构造值为0的结点 { this(0); } } public class Josephus //单向循环链表,解约瑟夫环 { private OnelinkNode head; Josephus(int n) // 建立n个结点的单向循环链表 { // 链表结点值为1到n int i = 1; OnelinkNode q, rear; if(n > 0){ head = new OnelinkNode(i); head.next = head; rear = head; while(i < n){ i++; q = new OnelinkNode(i); q.next = head; rear.next = q; rear = q; } } } public void display(int s,int d) // 解约瑟夫环 { int j = 0; OnelinkNode p = head; while(j < s - 1) // 计数起始点 { j++; p = p.next; } while(p.next != p) // 多于一个结点时循环 { j = 1; while(j < d - 1) // 计数 { j++; p = p.next; } delete(p); // 删除p的后继结点 p = p.next; this.output(); } } public void delete(OnelinkNode p) // 删除p的后继结点 { OnelinkNode q = p.next; // q是p的后继结点 System.out.print("delete: " + q.data + " "); if(q == head) // 欲删除head指向结点时, head = q.next; // 要将head向后移动 p.next = q.next; // 删除q } public void output() // 输出单向链表的各个结点值 { OnelinkNode p = head; System.out.print("data: "); do{ System.out.print(p.data + " -> "); p = p.next; }while(p != head); System.out.println(); } public static void main(String args[]){ int n = 5, s = 1, d = 2; Josephus h1 = new Josephus(n); h1.output(); h1.display(s,d); } } data: 1 -> 2 -> 3 -> 4 -> 5 -> delete: 2 data: 1 -> 3 -> 4 -> 5 -> delete: 4 data: 1 -> 3 -> 5 -> delete: 1 data: 3 -> 5 -> delete: 5 data: 3 ->