约瑟夫环

约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队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);
}

约瑟夫环问题(圆桌问题)相关推荐

  1. HDU4841 圆桌问题【约瑟夫环+模拟+STL】

    圆桌问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submissi ...

  2. python约瑟夫环问题给十个学生编号报到3者出列_趣味算法--约瑟夫环问题(示例代码)...

    问题描述 已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌上.指定编号为k的人开始从1报数,数到m的那个人出列:出列那个人的下一位又从1开始报数,数到m的那个人出列:以此规则重复下去, ...

  3. 约瑟夫环(约瑟夫问题)求最后出列的人数

    约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出 ...

  4. PHP解决约瑟夫环问题

    PHP解决约瑟夫环问题 一.总结 二.PHP解决约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到 ...

  5. 循环链表(约瑟夫环)的建立及C语言实现

    约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列: ...

  6. 约瑟夫环 单向循环链表实现

    约瑟夫环 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围 ...

  7. 约瑟夫环之循环链表实现

    约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开 始报数,数到m的那个人又出列:依此规律 ...

  8. C# 约瑟夫环 用数组实现

    约瑟夫环 已知n个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人 ...

  9. 循环链表解决约瑟夫环问题

    约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? "约瑟夫环是一个数学的应用问题:已知 ...

最新文章

  1. 【转】Unity游戏开发图片纹理压缩方案
  2. 8 种常见的SQL错误用法
  3. JavaScript的基本使用
  4. Linux inotify功能及实现原理【转】
  5. 洛谷 P1703 那个什么密码2
  6. 循环链表:拉丁方阵问题
  7. 斯坦福首位华人女院长,“人造皮肤”赋予机器和残疾人触觉
  8. 安装Ubuntu镜像和VMware在安装Ubuntu镜像之后开机蓝屏的解决方案
  9. JavaScript包管理器综述
  10. myeclipse 的 restart server和Redeploy/Reload application的区别
  11. 修改win10注册表来控制cpu的最大运行频率,实现电脑降温
  12. 小程序停止html5音乐,微信小程序-音乐播放器+背景播放
  13. 使用标尺工具获取某点的坐标
  14. 编写程序模拟用户输入手机号码、邮箱号码、座机号码,验证格式是否正确并给出提示,直到格式输入正确为止
  15. 快速排序(填坑法的两种写法以及交换法)
  16. 阿里云安全中心如何设置掌控云服务器安全
  17. IE 获取 本地 Mac地址
  18. eclipse配置python解析器_Eclipse中配置Python环境
  19. rails strip
  20. 一些简单好玩的Python编程游戏

热门文章

  1. c语言中的“/”和“%”运算
  2. 鸟哥 Linux 私房菜学习心得(一)
  3. Spreading the Wealth UVA - 11300 (分金币)(分析求中位数)
  4. word文档计算机在哪,电脑word文档中审阅功能在哪
  5. CH900无线电监测接收机综合指标参数
  6. Unicode编码转换为UTF-8编码
  7. 从零开始的iOS开发: 20 | 计算器APP
  8. html中map标签的用法,HTML中的map和area标签
  9. python之万年历
  10. 网线接口定义 网线定义 RJ45接口定义 T568A T568B DTE DCE 直连 交叉线