0010用顺序表实现约瑟夫环(Josephus)问题
2015-10-29 08:52
981 查看
问题描述:约瑟夫环问题,古代一法官要判决n个犯人的死刑,他的荒唐处决办法是,将犯人站成一圈,从第s个人开始数数,数到第d个人,就拉出来处决,然后再数d个,数到的人再处决,一直这样下去,最后的一个人得以幸免。那么当n=5(顺时针递增编号),s=1,d=2时,从编号1开始计数,最后幸免的编号是多少。
解题思路:1)先建立一个具有n个元素的顺序表对象ring1。
2)从第s个数据开始,依次计数,每数到d,就将该元素位置处置空。
3)重复上一步骤,依次选中n-1个数据元素出环。
4)输出所剩的最后一个数据元素。
5)本算法并没有采用直接的删除操作,而是置空操作,即赋值0,计数时跳过值为空的数据元素。
解题思路:1)先建立一个具有n个元素的顺序表对象ring1。
2)从第s个数据开始,依次计数,每数到d,就将该元素位置处置空。
3)重复上一步骤,依次选中n-1个数据元素出环。
4)输出所剩的最后一个数据元素。
5)本算法并没有采用直接的删除操作,而是置空操作,即赋值0,计数时跳过值为空的数据元素。
#include "SeqList.h" #include<iostream> using namespace std; //编写一个实现函数 void display(int n,int s,int d) { SeqList ring1(n); //初始化顺序列表ring1 ring1.create(n); cout<<"ring:\t"; ring1.output(); int i,j,k; i=s-1; k=n; while (k>1) { j=0; while (j<d) { i=i%n+1; if(ring1.get(i)!=0) j++; } cout<<"out : "<<ring1.get(i)<<"\t"; ring1.set(i,0); k--; cout<<"ring:\t"; ring1.output(); } i=1; while(i<=n&&ring1.get(i)==0) //寻找最后一人 i++; cout<<"The final person is "<<ring1.get(i)<<"\n"; } void main(void) { display(5,1,2); }为啥不行呢?明天继续更新得到正确结果。。。
相关文章推荐
- error:unknown filesystem grub rescue
- foreach DataTable或Table时要略过第一行。
- java对Memcached的基本操作
- mac下开发IOS代码管理
- UVa816 Abbott's Revenge
- Java IO专题
- JDBC中Statement接口提供的execute、executeQuery和executeUpdate之间的区别
- Factor Oracle自动机的构造
- 八大排序算法的 Python 实现
- 一名合格的测试员应具备的素质
- 深入解析Java编程中的抽象类
- Servlet
- Android 进程生命周期 Process Lifecycle
- 后缀自动机构造过程演示
- Wappalyzer
- Linux subversion安装与配置
- 一位老医生的长寿忠告
- linux中的文件特殊权限
- 第8周项目4字符串加密
- 也谈测试的核心技术