约瑟夫环问题(圆桌问题)
约瑟夫环
约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死、所以用一种策略来先后kill所有人。于是约瑟夫建议:每次由其他两人一起kill一个人,而被kill的人的先后顺序是由抽签决定的,约瑟夫有预谋地抽到了最后一签,在kill了除了他和剩余那个人之外的最后一人,他劝服了另外一个没死的人投隆了罗马:
大致题意
在一间房间总共有n个人(下标O~n-1) ,只能有最后一个人活命。按照如下规则去清除人:
- 所有人围成一圈
- 顺时针报数,每次报到m的人将被清除掉被清除掉的人将从房间内被移走
- 然后从被kill掉的下一个人重新报数,继续报数,报m的再清除,直到剩余一人
示例:
n=10,m=3,liv2=2 //live表示最终存活的人数
第3个人自杀,约瑟夫环编号为1
第6个人自杀,约瑟夫环编号为2
第9个人自杀,约瑟夫环编号为3
第2个人自杀,约瑟夫环编号为4
第7个人自杀,约瑟夫环编号为5
第1个人自杀,约瑟夫环编号为6
第8个人自杀,约瑟夫环编号为7
第5个人自杀,约瑟夫环编号为8
第10个人自杀,约瑟夫环编号为9
第4个人自杀,约瑟夫环编号为10存活的人位置和约瑟夫环为:
所在位置: 4 约瑟夫环编号:10
所在位置: 10 约瑟夫环编号:9
解题思路
用一个数组和取模操作进行循环遍历,时间复杂度 O(n*k)
#include<bits/stdc++.h>
using namespace std;
#define MAX_SIZE 1001
//约瑟夫环
//sum 总人数 k:计数 live:存活的人数
void yueshefu(int k,int sum,int live){int man[MAX_SIZE]={0};//标记数组 man[i]表示第i个人的自杀顺序为 man[i]int count=1;//用来计数 int i=0,pos=-1;while(count<=sum){do{pos=(pos+1)%sum;if(man[pos]==0)i++;if(i==k){i=0;break;}}while(1);man[pos]=count;//赋值printf("第%d个人自杀,约瑟夫环编号为%d\n",pos+1,man[pos]);count++;}cout<<"\n存活的人位置和约瑟夫环为:\n";live=sum-live;for(int i=0;i<sum;i++){if(man[i]>live)cout<<"所在位置: "<<i+1<<" 约瑟夫环编号:"<<man[i]<<endl;}
}
int main(){yueshefu(3,10,2);
}
约瑟夫环问题(圆桌问题)相关推荐
- HDU4841 圆桌问题【约瑟夫环+模拟+STL】
圆桌问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submissi ...
- python约瑟夫环问题给十个学生编号报到3者出列_趣味算法--约瑟夫环问题(示例代码)...
问题描述 已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌上.指定编号为k的人开始从1报数,数到m的那个人出列:出列那个人的下一位又从1开始报数,数到m的那个人出列:以此规则重复下去, ...
- 约瑟夫环(约瑟夫问题)求最后出列的人数
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出 ...
- PHP解决约瑟夫环问题
PHP解决约瑟夫环问题 一.总结 二.PHP解决约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到 ...
- 循环链表(约瑟夫环)的建立及C语言实现
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列: ...
- 约瑟夫环 单向循环链表实现
约瑟夫环 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围 ...
- 约瑟夫环之循环链表实现
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开 始报数,数到m的那个人又出列:依此规律 ...
- C# 约瑟夫环 用数组实现
约瑟夫环 已知n个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人 ...
- 循环链表解决约瑟夫环问题
约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? "约瑟夫环是一个数学的应用问题:已知 ...
最新文章
- 【转】Unity游戏开发图片纹理压缩方案
- 8 种常见的SQL错误用法
- JavaScript的基本使用
- Linux inotify功能及实现原理【转】
- 洛谷 P1703 那个什么密码2
- 循环链表:拉丁方阵问题
- 斯坦福首位华人女院长,“人造皮肤”赋予机器和残疾人触觉
- 安装Ubuntu镜像和VMware在安装Ubuntu镜像之后开机蓝屏的解决方案
- JavaScript包管理器综述
- myeclipse 的 restart server和Redeploy/Reload application的区别
- 修改win10注册表来控制cpu的最大运行频率,实现电脑降温
- 小程序停止html5音乐,微信小程序-音乐播放器+背景播放
- 使用标尺工具获取某点的坐标
- 编写程序模拟用户输入手机号码、邮箱号码、座机号码,验证格式是否正确并给出提示,直到格式输入正确为止
- 快速排序(填坑法的两种写法以及交换法)
- 阿里云安全中心如何设置掌控云服务器安全
- IE 获取 本地 Mac地址
- eclipse配置python解析器_Eclipse中配置Python环境
- rails strip
- 一些简单好玩的Python编程游戏
热门文章
- c语言中的“/”和“%”运算
- 鸟哥 Linux 私房菜学习心得(一)
- Spreading the Wealth UVA - 11300 (分金币)(分析求中位数)
- word文档计算机在哪,电脑word文档中审阅功能在哪
- CH900无线电监测接收机综合指标参数
- Unicode编码转换为UTF-8编码
- 从零开始的iOS开发: 20 | 计算器APP
- html中map标签的用法,HTML中的map和area标签
- python之万年历
- 网线接口定义 网线定义 RJ45接口定义 T568A T568B DTE DCE 直连 交叉线