• [面试] 面向对象的约瑟夫环问题的通法 [ 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;
    }

  • 相关阅读:
    Linux I2C设备驱动编写(一)
    Device Tree常用方法解析
    Linux查看CPU型号及内存频率及其它信息的命令
    编译错误error: invalid storage class
    Mysql技术内幕——表&索引算法和锁
    mysql 锁
    MySQL 索引方式
    通过show status 来优化MySQL数据库
    linux shell 字符串操作(长度,查找,替换)详解
    bash中将字符串split成数组的方法
  • 原文地址:https://www.cnblogs.com/robbychan/p/3787137.html
Copyright © 2020-2023  润新知