zoukankan      html  css  js  c++  java
  • [面试] 面向对象的约瑟夫环问题的通法 [ C++实现 ] [为夏逸轩师弟作]

    说明 :有两个类,Kid 和 KidCircle,
    类Kid代表王子,就是王子类,这个类里面有一个王子编号id, int类型的, 还有两个 王子kid指针 left 和  right ,因为王子们要围成一个圈子嘛,所以left,right分别代表该王子的左手边的人和右手边的人!  类KidCircle就是“王子圈”类,类中count记录该“王子圈”里面有多少个人,first,last分别指向第一个王子 和 最后一个王子!KidCircle(int);构造方法是用来初始化 此时的王子圈的,参数int表示圈子中有多少人,add()是向圈中增加王子,del()是删除圈中的王子!
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define BUG cout << "here\n";
    using namespace std;
    
    class Kid {
    public :
        int id;
        Kid* left;
        Kid* right;
    };
    class KidCircle {
    public :
        int count;
        Kid *first, *last;
    public :
        KidCircle(int);
        void add();
        void del(Kid*&);
    };
    KidCircle::KidCircle(int n) : count(0) {
        for(int i = 1; i <= n; i++) {
            add();
        }
    }
    void KidCircle::add() {
        Kid *k = new Kid();
        count++;
        k->id = count;
        if(count <= 1) {
            first = k;
            k->left = k;
            k->right = k;
            last = k;
        }
        else {
            last->right = k;
            k->left = last;
            k->right = first;
            first->left = k;
            last = k;
        }
    }
    void KidCircle::del(Kid*& k) {
        if(count <= 0) {
            return;
        }
        else if (count == 1) {
            first = last = NULL;
        }
        else {
            if(k->left)
                k->left->right = k->right;
            if(k->right)
                k->right->left = k->left;
    
            if(k == first) {
                first = k->right;
            }
            else if(k == last) {
                last = k->left;
            }
        }
        count--;
    }
    int main() {
        int T, n, m;
        cin >> T;
        while(T--) {
            cin >> n >> m;
            KidCircle *kc = new KidCircle(n); /// n 个王子的围成的 圈
    
            int countNum = 0;
            Kid *k = kc->first; /// 王子
    
            while(kc->count > 1) { /// 圈子中剩下的王子大于 1
                countNum++;
                if(countNum == m) {
                    countNum = 0;
                    cout << k->id << ' ';
                    kc->del(k);
                }
                k = k->right;
            }
            cout << k->id << endl;
        }
        return 0;
    }

  • 相关阅读:
    .net注册iis
    hdu 1081To The Max
    hdu 1312Red and Black
    hdu 1016Prime Ring Problem
    hdu 1159Common Subsequence
    hdu 1372Knight Moves
    hdu 1686Oulipo
    hdu 1241Oil Deposits
    hdu 1171Big Event in HDU
    hdu 4006The kth great number
  • 原文地址:https://www.cnblogs.com/robbychan/p/3787137.html
Copyright © 2011-2022 走看看