前几天看到一个编程题,约瑟夫环问题。问题的由来是一个犹太故事,41一个人被困,有39个人想要自杀,想活下去的两个人就出主意说,大家围成一个环,报到3的人自杀。结果两个人成功脱险,也就诞生了这个算法。
由于本人实力有限,写出的程序也并未进行优化,可能时间复杂度和空间复杂度上有很多问题,只希望给各位网友一些思路。
ps:有一个懂算法的朋友是件多么幸福的事儿啊,请善待身边的程序员朋友。。
public class YSFRing {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Ring(41,3);
}
public static void Ring(int personNum,int killNum){
int pos = -1;
int i = 1;//报的数
int j = personNum;
int k = 0;
int[] arr = new int[personNum];
while(j>=killNum){
pos = (pos+1)%personNum;//pos为数组脚标,并进行环处理
if(arr[pos]==0){
if(i==killNum){
arr[pos] = i;
j--;
i=0;
k++;
int p = pos+1;
System.out.println("第"+k+"个人被干掉了!==========位置是"+p);
}
i++;
}
}
for(int s=0;s<arr.length;s++){
if(arr[s]==0){
pos = s+1;
System.out.println("位置"+pos+"的人还活着");
}
}
}