求解约瑟夫环问题

来源:互联网 发布:php文件上传下载源码 编辑:程序博客网 时间:2024/04/28 09:15
 
计算机信息工程学院学生实验报告
专业:_姓名:_ 学号:日期:_
课程名称
Java语言程序设计
实验室名称
 
实验名称
Java语言程序设计基础训练
指导教师
 
成绩
 
1、            实验目的
熟悉Java程序结构,掌握基本数据类型的使用方法,熟练运用分支、循环等语句控制程序流程,掌握数组和字符串类型的使用方法。
 
 
 
2、            实验原理和内容
求解约瑟夫环问题
约瑟夫环(Josephus)问题:古代某法官要判决N个犯人的死刑,他有一条荒唐的法律,将犯人站成一个圆圈,从第S个人开始数起,每数到第D个犯人,就拉来处决,然后再数D个,数到的人再处决……直到剩下的最后一个可赦免。

 
当N=5,S=1,D=2时,约瑟夫环问题执行过程如下图所示。

 
 
 
 
 
 
 

 
 
3、            实验步骤
public class testJosephus{
    public static void main(String args[]){
       Josephus a = new Josephus(5);
       a.print();
       System.out.println("Liver is Number "+a.kill(1,2));
    }
}
 
class Josephus{
    int ring[];
    public Josephus(int n){
       ring = new int[n];
       for (int i = 0;i<n;i++){
           ring[i] = i+1;
       }
    }
    public int kill(int s,int d){
       int n = ring.length;
       int k = 0;
       int judge = s-1;
       int killer = 0;
       while (n>1){
           if (ring[judge] != 0){
              k++;
           }
          
           if (k==d){
              ring[judge] = 0;
              k = 0;
              n--;
           }
          
           if (judge == ring.length-1){
              judge =-1 ;
           }
           judge++;
          
       }
       for (int i=0;i<ring.length;i++){
           if (ring[i] != 0){
              killer = i+1;
           }
       }
       return killer;
      
    }
   
    public void print(){
       for (int i=0;i<ring.length;i++){
           System.out.print(ring[i]+" ");
       }
       System.out.println();
    }
}
4、            程序及运行结果(或实验数据记录及分析)
运行结果为:
1 2 3 4 5
Liver is Number 3
Press any key to continue...
 
当N=10,S=2,D=3时,运行结果为:
1 2 3 4 5 6 7 8 9 10
Liver is Number 5
Press any key to continue...
 
原创粉丝点击