约瑟夫环解法***
2015-11-28 20:28
295 查看
约瑟夫(Josephus)问题是由古罗马的史学家约瑟夫提出的,他参加并记录了公元66-70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名将士在附近的一个洞穴中避难。在哪里,将士们群情激奋并表示:要投降毋宁死。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签并且做为洞穴中两个幸存者之一生存下来。 约瑟夫环问题的具体描述是:设有编号为1,2,......,n的n(n>0)个人围成一个圈,从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,......,如此下去,知道只剩下一人为止。当任意给定 n和 m后,设计算法求 n个人出圈的次序。
#define SIZE 1000 #import <Foundation/Foundation.h> int main(){ int n; //总共的人数,参加死亡游戏的人数 int m; //报数停止时的数 int k; //从哪个人开始 int array[SIZE] = {0}; //定义一个整形数组,用来存放n的值,也就是总共的人数 for(int i=0;i<n;i++){ array[i] = i + 1; } int count = 0; //用来临时存放数的数 count总是小于m的 int number = n; //剩余人数 while(number > 1){ //只要剩余的人数比2个多,就得继续循环 for(int i = 0;i < n;i++){ //所以n个人至少循环n次,,,如果k不等于1的时候循环次数就少了,所有有上面的while循环 if(k != 1){ //如果k不等于1,也就是说报数开始不是从第一个人开始的-------------- i = k - 1; //那么把总人数看成一个环形排列,不分先后位置,这时候把k的位置看成第一个位置( 令k= 1)就行了,k位置的数组下标 i 总是等于i=k-1; k = 1; } if(array[i] == 0) //当array中的数被打印出时,被赋值为0,相当于人被淘汰掉, continue; //这时候跳出循环进行下次循环 count++; //当array[i]等于0的时候count不自加,也就是没有人被数到 if(count == m){ //当count == m的时候,也就是有个人被淘汰了,打印出,并且令array[i] =0;总人数减去一个,并且重新计数 printf("%d ",array[i]); array[i] = 0; number--; count = 0; } } } for(int i= 0;i<n;i++){ //怎样找出剩下的最后一个人 if(array[i] !=0){ printf("%d\n",array[i]; break; //最后一个人被找到就不用循环了 } } return 0; }
相关文章推荐
- 博客迁移指南
- arp 地址解析协议
- PHP5中PDO的入门教程
- Python爬虫实战(三):爬网易新闻
- 将你的电脑变成服务器!花生壳让你的电脑拥有自己的域名
- nodejs-url
- Android Studio 怎么查看方法注释
- 实用的签到、日程表日历控件(可扩展)
- typedef 和 const
- ASP.NET常用的弹窗方法
- android:clipChildren妙用:底部的radioGroup中间的button突出
- BestCoder Round #64 (div.1) A.Sum
- 单链队列——队列的链式存储结构
- hdu1077模拟
- 抄书问题
- vim中的杀手级插件: vundle
- Docker镜像
- Oracle数据库共享内存分配不足问题的解决
- iOS_UIImageView的contentMode属性--照片的显示模式
- 第三章:基本HTML结构