Josephus

public class jose {
 
 //返回出局人数
 public static int check(int people[],int n)
 {
  int k;
  int count=0;
   for(k=1;k<=n;k++)
   {
   if(people[k]==0) 
    count++; 
  }
   return count;
 }
 //返回从第i个人开始,第一个不为0的编号,i<=n
 public static int search(int people[],int n,int i)
 {
  int k;
  int s__=0;
  for(k=i;k<=n;k++)//遍历i<=X<=n之间的数据
  {
  if(people[k]!=0) 
   return k;
  }
  if(k==n)     //遍历1<=X<i之间的数据
  {
   for(k=1;k<i;k++)
   {
   if(people[k]!=0) 
    return k;
   } 
  }
  return s__;
 }
 
      public static void Jose(int people[],int n,int s,int d)
       {
     int i=0,temp=0,m=1;
        int s_=s,d_=d;
     int peo[]=new int [n+1];
     int result[]=new int [n];
    for(i=0;i<=n;i++)
     peo[i]=people[i];
    
    while(check(peo,n)!=n-1)
    {
     int count=0;
     //返回第d个犯人的编号
     while(count<d)
     {
      temp=search(peo,n,s_);
      if(temp!=0)
        count++;
      
      if(temp==n+1)
        temp=1;
      
      s_=temp;
     }
     //记录出局人的编号,并标识此人已出局
     result[m++]=peo[s_];
     people[s_]=0;
     
     //寻找下一个编号不为0
     temp=search(peo,n,s_);
     if(temp!=0)
       count++;
     
     if(temp==n+1)
       temp=1;
     
     s_=temp;
     
     s_=search(peo,n,s_);//有人出局后,返回此人后面第一个未出局人的编号
    }
    result[m]=peo[s_];
    
    //显示出局结果
    System.out.println("\n出局次序如下:  ");
    for(i=1;i<=n;i++)
    {
     System.out.print("  "+result[i]);
    }
       }
      
      
      public static void main(String args[])
      {
       int n=5;
      int s=1;
      int d=2;
      int i=0;
    int people[]=new int [n+1];
    System.out.println("初始次序如下:  ");
  
  for(i=0;i<=n;i++)
  {
   people[i]=i;
  }
  for(i=1;i<=n;i++)
  {
   System.out.print(" "+people[i]);
  }
      Jose(people,n,s,d);
      }
}


 

你可能感兴趣的:(Josephus)