“圆桌问题”

这篇博客提供了两种编程方法来解决一个圆桌问题:当2n个人中n个是好人,n个是坏人,每数到第m个人就处死,如何安排座位使得最后剩下的是好人。第一种方法使用数组记录好人和坏人的状态,第二种方法通过模拟动态变换的圆桌。这两种C++实现的解决方案分别利用了数组和vector动态删除元素的特点,确保在处死n个人后,圆桌上剩下的都是好人。
摘要由CSDN通过智能技术生成

圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。

#输入
多组数据,每组数据输入:好人和坏人的人数n(<=32767)、步长m(<=32767);

输出
对于每一组数据,输出2n个大写字母,‘G’表示好人,‘B’表示坏人,50个字母为一行,不允许出现空白字符。相邻数据间留有一空行
 

输入样例:

2 3

2 4

输出样例:

GBBG

BGGB

 第一种解法:(数组)

#include <iostream>
#include<vector>
using namespace std;



int main()
{
    vector<int> table;
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        for(int i=0;i<2*n;i++) table.push_back(0);

        int sum = table.size();
        int cur = 0;
        while(sum>n){
            for(int i=0;i<2*n;i++){
                if(table[i]) continue;
                cur++;
                if(cur==m){
                    table[i] = 1;
                    cur = 0;
                    sum--;
                }
            }
        }
        for(int i=0;i<2*n;i++){
            if(table[i]==0) cout<<"G";
            if(table[i]==1) cout<<"B";
            if(i%50==0&&i) cout<<endl;
        }
    }
    return 0;
}

第二种解法:(vector模拟动态变换的圆桌 )


#include <iostream>
#include<vector>
using namespace std;



int main()
{
    vector<int> table;
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        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-1+m)%table.size();       //看成一个环,取余做处理
            table.erase(table.begin()+pos);    //每赶走一个人,size()减一
        }
        int j=0;
        for(int i=0;i<2*n;i++){
            if(i%50==0&&i) cout<<endl;
            if(i==table[j]&&j<table.size()){
                j++;
                cout<<"G";
            }
            else{
                cout<<"B";
            }
        }
    }
    return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值