[面试] 面向对象的约瑟夫环问题的通法 [ C++实现 ] [为夏逸轩师弟作]
说明 :有两个类,Kid 和 KidCircle,
类Kid代表王子,就是王子类,这个类里面有一个王子编号id, int类型的, 还有两个 王子kid指针 left 和 right ,因为王子们要围成一个圈子嘛,所以left,right分别代表该王子的左手边的人和右手边的人! 类KidCircle就是“王子圈”类,类中count记录该“王子圈”里面有多少个人,first,last分别指向第一个王子 和 最后一个王子!KidCircle(int);构造方法是用来初始化 此时的王子圈的,参数int表示圈子中有多少人,add()是向圈中增加王子,del()是删除圈中的王子!
类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;
}

浙公网安备 33010602011771号