HDUOJ4841圆桌问题

圆桌问题

问题描述:圆桌上围坐着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版权协议,转载请附上原文出处链接和本声明。