poj3750-小孩报数问题(约瑟夫环)

时间:2021-07-07 02:10:39

一,题意:
  中文题。
二,思路:
  1,输入。
  2,无限循环1~n~1~n,直到输出n次,再跳出。
  3,输出名字,并标记。

普通模拟版:

 #include<iostream>
#include<cstring>
using namespace std;
int main() {
char name[][];
int n, w, s;
cin >> n;
for (int i = ; i <= n; i++) {
cin >> name[i];
}
scanf("%d,%d", &w, &s);
int count = ; //记录经过未标记的名字几次
int k = ; //记录输出的次数
for (int i = w; k!=n ; i++) { //输出 n 次,跳出
if (i > n) i = i % n; //循环 1~n~1~n
if (strcmp(name[i], "")) count++; //经过未标记的名字时 count++
if (count == s) { //经过s次未被标记的名字时
cout << name[i] << endl;
k++; //输出一次 k++
count = ; //输出以后count重新记数
w = i; //输出之后,w 重新从 i 开始
strcpy(name[i], ""); //已经输出的名字标记为 1
}
}
return ;
}

线性表模拟版:

 #include<iostream>
#include<string>
using namespace std; class SeqList {
public:
SeqList(string str[], int n); //构造函数,创建长度为n 的线性表
string Delete(int i); //输出并删除结点
int getLength() { return length; } //获取长度
private:
int length;
string name[];
}; SeqList::SeqList(string str[], int n) { //实现构造函数
for (int i = ; i < n; i++) {
name[i] = str[i];
}
length = n;
} string SeqList::Delete(int i) {
string x = name[i - ]; //定义一个x接收被删除的字符串
for (int j = i; j < length; j++) { //从被删除的结点开始,后面的向前移动,覆盖被删除的结点
name[j - ] = name[j];
}
length--; //删除一个结点,长度减 1
return x;
} int main() {
string str[];
int n, w, s;
cin >> n;
for (int i = ; i < n; i++) {
cin >> str[i];
}
scanf("%d,%d", &w, &s);
SeqList S(str, n);
while(n--) {
int ans = (w + s - ); //ans 表示要输出的名字的序号
if ( ans==S.getLength() ) {
w = ans;
cout << S.Delete(w) << endl;
}
else {
if (ans % S.getLength() != ) {
w = ans % S.getLength();
cout << S.Delete(w) << endl;
}
else {
cout << S.Delete(w--) << endl;
} } }
return ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。