课后习题 2-1 约瑟夫问题变形

题目:

设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,……,如此反复直到所有的人全部出局为止。下面要解决的Josephus问题是:对于任意给定的n, s和m,求出这n个人的出局序列。请以n = 9, s = 1, m = 5为例,人工模拟Josephus的求解过程以求得问题的解。

 

Josephus.h

#pragma once
#include<iostream>
using namespace std;

class LNode {
public:
    int data;
    LNode* next;
};

class LinkList {
private:
    LNode* first;
public:
    LinkList() {
        first = new LNode();
        first->data = 666;
        first->next = nullptr;
    }
    LinkList(int num) {
        first = new LNode();
        first->data = 666;
        first->next = nullptr;
        creat( num);
    }
    void creat(int num) {
        LNode* s;
        LNode* q;
        q = first;
        for (int i = 0; i < num; i++) {
            s = new LNode();
            s->data = i + 1;
            s->next = q->next;
            q->next = s;
            q = s;
        }
        q->next = first->next;
    }
    void show() {
        LNode* p = first->next;
        while (p->next!=first->next) {
            cout << p->data << " ";
            p = p->next;
        }
        cout << p->data << " ";
        putchar('\n');
    }
    void Jo(int s, int m,int n) {
        LNode* p;
        p = first;
        for (int i = 0; i < s-1; i++) {
            p = p->next;
        }
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < m - 1; j++) {
                p = p->next;
            }
            cout << "remove: " << p->next->data << endl;
            p->next = p->next->next;
        }
        cout << "residue: " << p->data << endl;
    }
};

main.cpp

#include"Josephus.h"

int main() {
    LinkList L(9);
    L.show();
    L.Jo(1, 5, 9);
    return 0;
}

posted @ 2020-03-15 10:19  落地就是一把98K  阅读(215)  评论(0)    收藏  举报