约瑟夫环问题: 41个犹太人为了表示不像罗马人屈服,决定集体自杀,其中由约瑟夫和他的朋友,他们两个不想自杀。自杀的规则是41个人围成圈,轮流报数,报到3的自杀,下一个从1开始从新报,以此类推。 约瑟夫和他的朋友想活下来就要让他们成为最后两个人,然后放弃自杀规则。问约瑟夫和他的朋友应该在环的哪两个位置?
public static int[] Josep(int total,int live){ int[] dieOrder=new int[total];//记录约瑟夫编号,即死亡顺序 for(int i=0;i<total;i++){//逐个初始化 dieOrder[i]=0; } int i=0;//游标 int call=1;//报数 int die=0;//死亡人数 while(die<total-live){ if(i==total){ i=0;//如果到尾回到头,形成环 } if(dieOrder[i]==0){//活人计数 if(call<3){ call++; }else{ dieOrder[i]=++die;//记录约瑟夫编号 //System.out.PRintln("第"+die+"个自杀的人是 "+(i+1)+"号"); call=1; } } i++;//移动位置 } int[] survive=new int[live]; int k=0; System.out.print("可以活下来的位置是:"); for(int j=0;j<total;j++){ if(dieOrder[j]==0){ System.out.print(j+1+" "); survive[k]=j+1; k++; } } return survive; } public static void main(String[] args){ JosepCircle.Josep(41, 2); }第1个自杀的人是 3号第2个自杀的人是 6号第3个自杀的人是 9号第4个自杀的人是 12号第5个自杀的人是 15号第6个自杀的人是 18号第7个自杀的人是 21号第8个自杀的人是 24号第9个自杀的人是 27号第10个自杀的人是 30号第11个自杀的人是 33号第12个自杀的人是 36号第13个自杀的人是 39号第14个自杀的人是 1号第15个自杀的人是 5号第16个自杀的人是 10号第17个自杀的人是 14号第18个自杀的人是 19号第19个自杀的人是 23号第20个自杀的人是 28号第21个自杀的人是 32号第22个自杀的人是 37号第23个自杀的人是 41号第24个自杀的人是 7号第25个自杀的人是 13号第26个自杀的人是 20号第27个自杀的人是 26号第28个自杀的人是 34号第29个自杀的人是 40号第30个自杀的人是 8号第31个自杀的人是 17号第32个自杀的人是 29号第33个自杀的人是 38号第34个自杀的人是 11号第35个自杀的人是 25号第36个自杀的人是 2号第37个自杀的人是 22号第38个自杀的人是 4号第39个自杀的人是 35号可以活下来的位置是:16 31更复杂的约瑟夫环是自杀规则不定,每个人有一个数字,一个人自杀后,后面的人需要报数到这个数字才自杀。需要更灵活:
public static int[] hardJosep(int total,int live,int[] no){//no存储每个人的自杀规则数字 int[] dieOrder=new int[total];//记录约瑟夫编号,即死亡顺序 for(int i=0;i<total;i++){//逐个初始化 dieOrder[i]=0; } int i=0;//游标 int call=1;//报数 int die=0;//死亡人数 int callNum=no[0]; while(die<total-live){ if(i==total){ i=0;//如果到尾回到头,形成环 } if(dieOrder[i]==0){//活人计数 if(call<callNum){ call++; }else{ dieOrder[i]=++die;//记录约瑟夫编号 System.out.println("第"+die+"个自杀的人是 "+(i+1)+"号"); call=1; callNum=no[i]; } } i++;//移动位置 } int[] survive=new int[live]; int k=0; System.out.print("可以活下来的位置是:"); for(int j=0;j<total;j++){ if(dieOrder[j]==0){ System.out.print(j+1+" "); survive[k]=j+1; k++; } } return survive; }当no都是3时和普通约瑟夫环相同,当给no附复杂的数组,就会产生不同的结果。
public static void main(String[] args){ //JosepCircle.Josep(41, 2); int[] no=new int[41]; for(int i=0;i<41;i++){ no[i]=i+1; } JosepCircle.hardJosep(41, 2, no); }新闻热点
疑难解答