圆桌问题
问题描述:圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。
思路:用vector模拟动态变化的圆桌,赶走n个人之后留下的都是好人
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> table; // 模拟圆桌
int n, m;
while (cin >> n >> m) {
table.clear(); // 每次操作前需要清空圆桌
for (int i{}; i < 2 * n; i++) { // 初始化
table.push_back(i);
}
for (int pos{(m - 1) % table.size()}; table.size() > n; pos = (pos + m - 1) % table.size()) { // 赶走n个人,其中循环执行条件是当前圆桌上的人数多于原本总人数的一半;因为圆桌是个环,所以每次确定位置时进行取余处理
table.erase(table.begin() + pos); // 删除被数到的人
}
for (int i{}, j{}; i < 2 * n; i++) { // 从第一个座位开始安排
if (!(i % 50) && i) { // 每50个字母换行
cout << endl;
}
if (j < table.size() && i == table[j]) { // 若当前座位上有留下的人
j++; // 定位至下一个仍留在作为上的人
cout << "G";
} else { // 若当前座位上的人已被赶走
cout << "B";
}
}
cout << endl << endl; // 相邻数据间留一个空行
}
return 0;
}
版权声明:本文为weixin_56434818原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。