圆桌问题(动态数组vector)

本文介绍了一种算法,用于解决好人与坏人在圆桌上的座位安排问题,目标是在特定规则下,确保剩余的人全为好人。通过模拟圆桌场景,算法逐个移除指定位置的人,直到达到目标状态。

圆桌边围坐着2n个人。其中n个人是好人,另外n个人是坏人。从第一个人开始数,数到第m个人,立即赶走该人;然后从被赶走的人之后开始数,再将数到的第m个人赶走,依此方法不断赶走围坐在圆桌边的人。
预先应如何安排这些好人与坏人的座位,才能使得在赶走n个人之后圓桌边围坐的剩余的n个人全是好人?
输入:多组数据,每组数据输入: n,m≤32767。
输出:对于每一组数据,输出2n个大写字母,“G”表示好人,“B”表示坏人,50个字母为一行,不允许出现空白字符。相邻数据间留有一个空行。
输入样例:
2 3
2 4
输出样例:
GBBG
BGGB

#include<bits/stdc++.h>
using namespace std;
int main()
{
    vector<int>table; //模拟圆桌 
    int m,n;
    while(cin>>n>>m)
    {
  	table.clear();
  	for(int i=0;i<2*n;i++)
  	{
   	    table.push_back(i);    //初始化
  	}
  	int pos=0;      //记录当前位置
  	for(int i=0;i<n;i++)   //赶走n个人
  	{
   	    pos=(pos+m-1)%table.size(); //圆桌是个环,取余处理
            table.erase(table.begin()+pos);//赶走坏人,table人数减一
  	}
  	int j=0;
  	for(int i=0;i<2*n;i++)   //打印预先安排座位 
  	{
   	    if(!(i%50)&&i)
   	    {
    	   	cout<<endl;    //50个字母一行 
   	    }
   	    if(j<table.size()&&i==table[j])//table留下的都是好人 
   	    {
    	    	j++;
	    	cout<<"G"; 
	    } 
   	    else
   	    {
            	cout<<"B";
  	    }
  	}
  	cout<<endl<<endl;    //留一个空行 
    } 
    return 0;
} 
### 使用C++ STL解决约瑟夫问题的解决方案 约瑟夫问题可以通过C++标准模板库(STL)中的`vector`容器来实现,因为`vector`是一种动态数组,能够方便地模拟圆桌上的人员变化。以下是基于引用[^3]提供的代码示例,并结合STL容器特性进行优化和解释。 ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n, m; // n表示总人数,m表示每次数到的数字 while (cin >> n >> m) { // 多组输入 if (n == 0 && m == 0) break; // 输入为0 0时结束程序 vector<int> table; // 使用vector模拟圆桌 for (int i = 1; i <= n; i++) { table.push_back(i); // 初始化圆桌,编号从1到n } int pos = 0; // 当前位置变量 cout << "淘汰顺序: "; while (table.size() > 1) { // 当圆桌上还有超过一个人时继续 pos = (pos + m - 1) % table.size(); // 计算要淘汰的人的位置 cout << table[pos] << " "; // 输出被淘汰的人 table.erase(table.begin() + pos); // 删除被淘汰的人 } cout << endl << "最后剩下的人: " << table[0] << endl; // 输出最后剩下的人 } return 0; } ``` #### 代码解析 1. **初始化圆桌**:使用`vector<int>`来存储圆桌上的所有人,编号从1到n。 2. **计算位置**:通过公式`pos = (pos + m - 1) % table.size()`计算当前需要淘汰的人的位置。这里减去1是因为数组下标从0开始。 3. **删除元素**:使用`vector::erase`方法删除指定位置的元素,模拟淘汰过程。 4. **循环条件**:当`vector`中剩余人数大于1时,继续执行淘汰操作;否则输出最后剩下的那个人。 上述代码实现了约瑟夫问题的基本逻辑,并利用了STL容器`vector`的强大功能。 ### 注意事项 - `vector::erase`的时间复杂度为O(n),因此在大规模数据情况下可能会导致性能问题。如果需要更高效的实现,可以考虑使用`list`或`deque`等其他STL容器[^4]。 - 输入为`0 0`时程序结束,这是一种常见的终止条件设定。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【执珪】瑕瑜·夕环玦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值