(7)约瑟夫问题
来源:互联网 发布:js贪吃蛇 编辑:程序博客网 时间:2024/06/05 19:47
描述
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入
每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:
0 0
输出
对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
代码理解起来很绕
#include<iostream>using namespace std;int main(){ //一共最多有300只猴子 int succedent[300]; //这个数组用于保存一个猴子后一位是谁, //比如“next[5]的值是7”就是说5号猴子的下一位是7号猴子,6号猴子已经在之前退出了 int precedent[300]; //这个数组用于保存一个猴子前一位是谁,用法和上面的类型 int n, m; while (true){ cin >> n >> m; if (n == 0 && m == 0) break; for (int i = 0; i < n-1; i++){ succedent[i] = i + 1; precedent[i + 1] = i; } succedent[n - 1] = 0; precedent[0] = n - 1; int current = 0; while (true){ //如果一定要报m次号,那么取m //-1次succedent之后就是需要退出的那只猴子 for (int count = 0; count < m - 1; count++) current = succedent[current]; int pre = precedent[current]; int suc = succedent[current]; //让current号猴子退出很简单,就是把前一位的“下一位”指向current的下一位 //下一位的“前一位”指向current的前一位就好了 succedent[pre] = suc; precedent[suc] = pre; if (pre == suc){ //如果只剩下两个了,那么每个人的前位和后位就是同一个了 //current是退出的,那么另一个就是剩下的 //我们的序号是从0编号的,输出时要加一 cout << pre + 1 << endl; break; } current = suc; } } system("pause"); return 0;}
阅读全文
0 0
- (7)约瑟夫问题
- 环形链表,约瑟夫问题,(7)
- 约瑟夫(Joseph)问题
- 约瑟夫问题(c++)
- 约瑟夫问题(数组)
- 约瑟夫问题(单链表)
- 约瑟夫问题(数组)
- 约瑟夫(Josephus)问题
- 约瑟夫问题(Josephu)
- 约瑟夫(Josephus)问题
- 约瑟夫(Josephus)问题
- 对仗(约瑟夫问题)
- 约瑟夫问题(80)
- 约瑟夫问题(约瑟夫环) java
- 约瑟夫问题(经典问题)
- 约瑟夫问题、约瑟夫环
- Josephus问题(约瑟夫环)
- 约瑟夫问题(POJ2746;PG1078)
- iOS NSFileManager管理目录路径(3)——文件大小
- 3.LabVIEW_USB_I2C_AM2321B
- AutoIt:Windows自动化测试
- scala map排序
- js的包装对象
- (7)约瑟夫问题
- 【华为】数独
- php mcrypt加密实例
- LeetCode: 476. Number Complement
- 万能地图下载器矢量标注功能特性
- Java语言基础{Java_se(02)}-字面量和常量-变量的基本定义和使用-Java表达式-数据类型和分类-基本数据类型的转换-算数运算符-赋值运算符-比较运算符-三元运算符-逻辑运算符
- Effective Java(一)—— 创建和销毁对象
- 创建第一个线程
- Java设计模式-代理模式