【约瑟夫环的问题】
有17个人(编号从0到16),按编号依次排列成一个圆环(编号16的接着编号为0 的人),从编号为0 的人开始报数,数到3的人退出圆环,如此循环,最后留下的那个人的编号是什么?
0,1,2,3,4,5,6,7,8,,9,10,11,12,13,14,15,16
要求:请用面向对象的思想来处理这个问题并在下面写出具体的代码(可以选择你熟悉的语言,如java/C++/C#等)
代码如下:
public class Josephus {
      /**
* 自己的编号
*/
      private final int number;
      /**
* 链表指针
*/
      private Josephus previous;
      /**
* 链表指针
*/
      private Josephus next;
      /**
* 创建一个新的<code>Josephus</code>对象。
* 
* @param number
* 自己的编号
*/
      public Josephus(int number) {
            this.number = number;
      }
      /**
* 返回 <code>number</code> 的当前值。
*
* @return <code>number</code> 的当前值
*/
      public int getNumber() {
            return number;
      }
      /**
* 返回 <code>previous</code> 的当前值。
* 
* @return <code>previous</code> 的当前值
*/
      public Josephus getPrevious() {
            return previous;
      }
      /**
* 设置 <code>previous</code> 的当前值。
* 
* @param previous
* <code>previous</code> 的当前值
*/
      public void setPrevious(Josephus previous) {
            this.previous = previous;
      }
      /**
* 返回 <code>next</code> 的当前值。
* 
* @return <code>next</code> 的当前值
*/
      public Josephus getNext() {
            return next;
      }
      /**
* 设置 <code>next</code> 的当前值。
* 
* @param next
* <code>next</code> 的当前值
*/
      public void setNext(Josephus next) {
            this.next = next;
      }
      /**
* 从自己开始报数,报到的人被踢走。
* 
* @param n
* 报的数字
* @return 被踢走的人
*/
      public Josephus startCountingOut(int n) {
            Josephus current = this;
            for (int i = 1; i < n; i++) {
                  current = current.getNext();
            }
            return current.countOut();
      }
      /**
* 从自己开始报3个数,报到的人被踢走。
* 
* @return 被踢走的人
*/
      public Josephus startCountingOut() {
            return startCountingOut(3);
      }
      /**
* 被报到,而被踢走
* 
* @return 被踢走的人
*/
      private Josephus countOut() {
            previous.setNext(next);
            next.setPrevious(previous);
            return this;
      }
      @Override
      public String toString() {
            StringBuilder buff = new StringBuilder(64);
            buff.append(Josephus);
            buff.append(\nNum: ).append(number);
            buff.append(\nPrev: ).append(previous.getNumber());
            buff.append(\nNext: ).append(next.getNumber());
            return buff.toString();
      }
      public static Josephus init(int n) {
            Josephus[] arrays = new Josephus[17];
            for (int i = 0; i < arrays.length; i++) {
                  arrays[i] = new Josephus(i);
            }
            for (int i = 0; i < arrays.length; i++) {
                  arrays[i].setNext(arrays[(i + 1) % n]);
                  arrays[i].setPrevious(arrays[(i + n - 1) % n]);
            }
            return arrays[0];
      }
      public static void main(String[] args) {
            Josephus j = init(17);
            do {
                  System.out.println(报数的人:);
                  System.out.println(j);
                  j = j.startCountingOut();
                  System.out.println(被踢���的人:);
                  System.out.println(j);
                  // 移交给下一个人
                  j = j.getNext();
            } while ((j.getNext()) != j); // 就他一个了
            System.out.println(最后的幸存者:);
            System.out.println(j);
      }
}
该贴被root编辑于2013-2-25 11:07:02
该贴由koei转至本版2014-5-2 16:25:21