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);
}
}