NOI / 3.2数据结构之指针和链表1748:约瑟夫问题 队列

描述

约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
 

输入

每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:

0 0
 

输出

对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号

样例输入

6 2
12 4
8 3
0 0

样例输出

5
1
7
#include <iostream>  // 引入输入输出流库
#include <queue>     // 引入队列库
using namespace std; // 使用标准命名空间

int findMonkeyKing(int n, int m) {  // 定义函数findMonkeyKing,接收两个参数n和m
    queue<int> monkeys;  // 创建一个整数类型的队列monkeys
    // 初始化队列,将所有猴子的编号放入队列
    for (int i = 1; i <= n; ++i) {
        monkeys.push(i);  // 将编号为i的猴子加入队列
    }

    while (monkeys.size() > 1) {  // 当队列中还有多于一个猴子时执行循环
        for (int i = 1; i < m; ++i) {  // 报数m之前的猴子重新排到队尾
            monkeys.push(monkeys.front());  // 将队首的猴子加入队列
            monkeys.pop();  // 弹出队首的猴子
        }
        // 报到m的猴子退出圈外
        monkeys.pop();  // 弹出队首的猴子
    }

    // 最后剩下的猴子即为猴王
    return monkeys.front();  // 返回队列中唯一的元素,即猴王的编号
}

int main() {
    int n, m;
    while (cin >> n >> m && (n != 0 || m != 0)) {  // 从标准输入读取n和m的值,直到n和m都为0为止
        cout << findMonkeyKing(n, m) << endl;  // 调用findMonkeyKing函数,并输出结果
    }
    return 0;  // 程序正常结束,返回0
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值