用java解决约瑟夫问题

来源:互联网 发布:linux怎么删除组 编辑:程序博客网 时间:2024/05/22 13:25
  1. 用数组实现链表来解决约瑟夫问题:
class ArrayList{  
    public static void main(String[] args) {  
         
        //判断用户是否给出参数  
        //如果没有给出2个,则提示然后退出,否则继续  
        if(args.length!=2){  
            System.out.println("You must give two argument!");  
            System.exit(0);  
        }  
         
        //System.out.println(("123").matches("[0-9]*"));  
 
        //判断给的两个参数是否都是可以转换为数字  
        //如果两个参数中有一个不是,则提示,然后退出,否则继续  
        for(int i=0; i<args.length; i++){  
            if( !args[i].matches("[0-9]*")) {  
                System.out.println("Two argument must be Number!");  
                System.exit(0);  
            }  
        }  
         
        //利用给出的参数进行数组的初始化  
        int[] a=new int[Integer.parseInt(args[0])];  
        for (int i=0; i<a.length-1; i++){  
            a[i]=i+1;  
        }  
        a[a.length-1]=0;  
 
        int index=0;    //用来存储当前位置  
        int countNum=0; //用来计数  
 
        //测试数组是否赋值成功  
        /*for(int i=0; i<a.length; i++){  
            System.out.println(a[index]);  
            index=a[index];  
        }*/  
         
        //当某索引中的值与索引相同时,说明只剩下一个了  
        while(a[index] !=index ){  
            countNum ++;  
     
            //判断是否应该有人退出  
            //要改数到的那个同学的上一位,所以需要-1  
            //删除,就是把前一个索引处的值改成当前索引所对应的值  
            if (countNum==Integer.parseInt(args[1])-1){  
                a[index]=a[a[index]];    
                countNum=0;  
            }  
             
            index=a[index]; //设置下一个索引为当前索引对一个的值  
        }  
 
        System.out.println(index);  
    }  
}  

2、用数组实现:生成一个指定长度的数组,将所有的元素赋值为true,从头开始数,遇到countNum为3的将值改变为false;循环执行,直至只剩下一个true的值
public class Count3Quit
{
 public static void main(String [] args){
  boolean[] arr = new boolean[500];
  for(int i = 0;i<arr.length;i++){
   arr[i] = true;
  }
  int leftCount = arr.length;
  int countNum = 0;
  int index = 0;
  while(leftCount > 1){
   if(arr[index] == true){
    countNum ++;
    if(countNum == 3){
     arr[index] = false;
     countNum = 0;
     leftCount --;
    }
   }
   index ++;
   if(index == arr.length){
    index = 0;
   }
  }
  for(int i = 0;i<arr.length;i++){
   if(arr[i]==true){
    System.out.println(i);
   }
  }
 }
}

3、用面向对象的方式解决约瑟夫问题
有一个孩子的对象,有一个圆圈的对象。每一个孩子都有左孩子和右孩子以及自己的编号属性。圆圈对象,有开始孩子,结束孩子,以及孩子的总数;还有增加孩子和删除孩子的方法。首先增加500个孩子,然后从开始孩子开始数数,从1开始,每到3删除该孩子。直至只剩一个孩子,就是结果。
public class Count3Quit3
{
 public static void main(String [] args){
  KidCircle kc = new KidCircle(500);
  System.out.println(kc.last.id);
  int countNum =0;
  Kid k = kc.first;
  while(kc.count>1){
   countNum++;
   if(countNum == 3){
    kc.delete(k);
    countNum = 0;
   }
   k = k.right;
  }
  System.out.println(kc.first.id);
 }
}
class Kid
{
 int id;
 Kid left;
 Kid right;
}
class KidCircle
{
 int count = 0;
 Kid first;
 Kid last;
 KidCircle(int n){
   for(int i = 0;i<n;i++){
   add();
  }
 }
 void add(){
  Kid k = new Kid();
  k.id = count;
  if(count <= 0){
   first = k;
   last = k;
   k.left = k;
   k.right = k;
  }else{
   first.left = k;
   last.right = k;
   k.left = last;
   k.right = first;
   last=k;
  }
  count ++;
 }
 
 void delete(Kid k){
  if(count <= 0){
   return;
  }else if(count == 1){
   first = last = null;
  }else{
   k.left.right = k.right;
   k.right.left = k.left;
   if(k == first){
    first = k.right;
   }else if(k == last){
    last = k.left;
   }
  }
  count--;
 }
}









0 0
原创粉丝点击