Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29120
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-26 13:40
个人简介

学会谦卑和虔诚。

文章分类
文章存档

2016年(2)

2015年(2)

2014年(1)

分类: Java

2014-11-19 00:54:16

  去年学院举办的算法设计比赛,当时使用的c语言来描述的,而且当时刚刚学了数据结构。于是就用到循环链表来解决,虽然答案没有完全出来,但是评分的老师,看了我的代码和思路,也许是半个感情分,毕竟是学校的算法比赛,不是正规的比赛,于是给了半钩。
  现在学了Java语言,重新用java来解决这个问题。
  百度百科对约瑟夫问题的描述:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个 人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
  这个算法算出最后一个自杀的人的号码:

点击(此处)折叠或打开

  1. public class Josephus {
  2.     
  3.     public static void main(String[] args) {
  4.         boolean a[] = new boolean[10];
  5.         for(int i = 0; i < a.length; i ++) {
  6.             a[i] = true;
  7.         }        
  8.         
  9.         int dieNumber = 3;
  10.         int leftCount = a.length;
  11.         int index = 0;
  12.         int count = 0;
  13.         while(leftCount > 1) {
  14.             if(a[index]) {
  15.                 count++;
  16.                 if(count % dieNumber == 0) {
  17.                     a[index] = false;
  18.                     leftCount--;
  19.                 }
  20.             }
  21.             index++;
  22.             index %= a.length;
  23.         }
  24.             
  25.         for(int i = 0; i < a.length - 1; i++) {
  26.             if(a[i]) {
  27.                 System.out.print("最后剩下的人:" + (i+1));
  28.             }
  29.         }    
  30.     }
  31. }
    对上面的算法的改进,定义一个整型数组,里面存放模拟的人的编号,每当有人退出该圈的时候,就把他插入数组的尾部。

点击(此处)折叠或打开

  1. class Josephus1 {
  2.     public static void main(String[] args) {
  3.         int[] a = new int[41];

  4.         for(int i = 0; i < a.length; i++) {    //对数组中的元素进行赋值
  5.             a[i] = i + 1;    
  6.         }
  7.         
  8.         int index = 0;    //声明下标,表明元素所在的位置
  9.         for(int i = a.length; i > 0; i--) {    
  10.          index = (index + 2) % i;    //该出局的元素
  11.             int t = a[index];                            //不要把该出局的元素抛弃,先用临时变量存储,到时候在插入到数组的末尾
  12.             for(int j = index; j < i-1; j++) {
  13.                 a[j] = a[j+1];
  14.             }
  15.             a[i-1] = t;
  16.         }
  17.         
  18.         //倒序输出数组
  19.         for(int i = a.length-1; i >= 0; i--) {
  20.             System.out.print(a[i] + " ");
  21.         }
  22.     }
  23. }



阅读(784) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:java GUI编程:翻硬币游戏

给主人留下些什么吧!~~