zoukankan      html  css  js  c++  java
  • Josephus(约瑟夫)问题

    一群小孩围成一圈,任意假定一个数m,从第一个小孩数起,数到第m个的时候,该小孩离开,依次这样数下去,最后一个小孩是胜利者,问:胜利者是第几个小孩?

    单向循环列表实现

    #include <stdio.h>
    #include <assert.h>

    #define N 8

    typedef struct _LIST {
    int data;
    struct _LIST *next;
    } LIST;

    inline void list_init(LIST *node,int data,LIST *next) {
    node->data = data;
    node->next = next;
    }

    int josephus(LIST *head,int m) {
    int i;
    LIST *t=head;

    while(1) {
    for(i=0;i<m-2;i++) {
    head = head->next;
    }
    t = head;
    if(t->next==t) {
    break;
    } else {
    t->next = t->next->next;
    }
    head = head->next;
    }

    return t->data;
    }


    int main(int argc, char *argv[]) {
    LIST boys[N];// 使用数组避免手工分配和释放内存
    list_init(boys+7,8,boys+0);
    list_init(boys+6,7,boys+7);
    list_init(boys+5,6,boys+6);
    list_init(boys+4,5,boys+5);
    list_init(boys+3,4,boys+4);
    list_init(boys+2,3,boys+3);
    list_init(boys+1,2,boys+2);
    list_init(boys+0,1,boys+1);
    // 3 6 1 5 2 8 4 7
    assert(josephus(boys,3)==7);

    return 0;
    }

    注:可以修改程序,在josephus函数里面打印出列的人。

    面向对象方式实现

    主要是实现一个单向循环链表。

  • 相关阅读:
    策略模式
    Properties类学习笔记
    System类学习笔记
    一个反射的妙用案例
    new 对象时的暗执行顺序
    常用数据库默认端口号
    java对日开发常用语(词汇)总结
    java开发中常用语(词汇)含义
    MyBatis 常用词汇含义
    java SE,EE,ME区别
  • 原文地址:https://www.cnblogs.com/pingjiang/p/josephus.html
Copyright © 2011-2022 走看看