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

  • 相关阅读:
    jdk9 特性
    jdk8 特性
    Eclipse中Spring插件的安装
    C++避免程序运行完后窗口一闪而过的方法
    完全二叉树节点个数
    Shell 编写倒着的*三角形
    Drools源于规则引擎
    Spring Data MongoDB 三:基本文档查询(Query、BasicQuery
    docker环境搭建
    MyBatis根据数组、集合查询
  • 原文地址:https://www.cnblogs.com/robbychan/p/3787137.html
Copyright © 2020-2023  润新知