约瑟夫环
来源:互联网 发布:学校机房系统还原软件 编辑:程序博客网 时间:2024/04/20 17:21
用数组实现约瑟夫出圈问题,n个人排成一圈,从第一个开始报数,报到m的人出圈,
剩下的人继续开始从1报数,直到所有的人都出圈为止。对于给定的n,m,
求出所有的人出圈顺序。
转的一个比较易懂地方法
- package class_only;
- import java.util.ArrayList;
- import java.util.List;
- /** */
- /**
- * @author huangjie
- * @createDate 2008-11-20
- * @package
- * @fileName OutofCircle.java
- **/
- public class Test {
- public static void main(String[] args) {
- OutOfCirle ooc = new OutOfCirle(10, 100);
- ooc.begin();
- }
- }
- class OutOfCirle {
- // 报出了这个数的都退出
- public static int outNumber;
- // 总的有多少个人
- public static int manSize;
- // 上面2个一开始就固定好了,所以我就声明成static
- // 圈中的人
- private List<Man> allMan;
- // 现在已经报到第几号了,初始化为1
- private int nowNumber = 1;
- // 现在已经报到第几个人了,初始化为0;
- private int nowMan = 0;
- public OutOfCirle(int manSize, int outNumber) {
- OutOfCirle.manSize = manSize;
- OutOfCirle.outNumber = outNumber;
- init();
- }
- private void init() {
- allMan = new ArrayList();
- // 初始化所有人,即把所有人编上号
- int manNumber = 0;
- while (OutOfCirle.manSize != manNumber) {
- allMan.add(new Man(++manNumber));
- }
- }
- public void begin() {
- while (allMan.size() > 0) {
- Man man = this.select();
- // 把这个人T出去
- allMan.remove(man);
- // 当T的是最后一个的时候,又从第一个开始数
- if (nowMan == allMan.size()) {
- nowMan = 0;
- }
- // 说明T的不是最后一个
- // T的人的后面的都会往前移一个位置
- // 这样就把原来的nowman代替了,就可以从nowman开始数了
- else {
- }
- // 选出来了以后又从1开始报
- nowNumber = 1;
- System.out.println("我是第" + man.getNumber() + "号,我现在被T出去了,我是第"
- + (manSize - allMan.size()) + "个被T的" + ",还有"
- + allMan.size() + "在圈里");
- }
- System.out.println("所有人都被T出去完了");
- }
- // 找出报outNumber的人
- private Man select() {
- Man man = null;
- // 没选出来就一直报数
- while (man == null) {
- // nowman报数
- Man m = allMan.get(nowMan);
- boolean right = m.reckon(nowNumber);
- // 就是他了
- if (right) {
- man = m;
- }
- // 说明不是他
- else {
- // 报的数字到下一个
- nowNumber++;
- // 人也到下一个去
- nowMan++;
- // 说明已经到了最后一个了
- if (nowMan == allMan.size()) {
- // 又从第一个开始报数
- nowMan = 0;
- }
- }
- }
- return man;
- }
- }
- class Man {
- private int number;
- public Man(int number) {
- this.number = number;
- }
- public int getNumber() {
- return number;
- }
- // 报数:判断报出的数字是否和outNumber
- public boolean reckon(int num) {
- return num == OutOfCirle.outNumber;
- }
- }
- 约瑟夫问题、约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 21点小游戏
- Common Dbutils组件的使用
- VB中容易出现的溢出错误
- 对象不能从DBNull转换为其他类型
- GridView中嵌入radio,实现单选
- 约瑟夫环
- 17种物品!家里的健康杀手
- 颠覆智能卡
- AS4安装oracle 9.2
- 使用java datasource 进行 oracle jdbc 连接
- 16种蔬菜帮你降低血糖
- j2me中使用canvas设置背景颜色示例
- db2 日期对减得到的天数
- 图片闪亮效果