菜鸟“约瑟夫环问题”的不解之处,恳请各位高人能对小弟给予指点,拜谢!~~ 题目的意思:设有N个人围坐一圈并按顺时针方向从1到N编号,从第S个人开始进行1到M报数,报数到第M的人出圈,再从他的下一个人重新开始从1到M报数,如此进行下去,每次报数到M的人就出圈,知道所有人都出圈为止。给出这N个人的出圈顺序。
代码如下:
public class Count5Quit1 {
public static void main(String[] args) {
final int N = 13; //总人数N
final int S = 3; //从第S个人开始报数
final int M = 5; //报数到M的人出圈
int[] p = new int[N];
int i,w,s,j;
for(i=1; i<=N; i++)
p[i-1] = i; //对每个人进行编号
s = S;
for(i=N; i>=1; i--){ //总人数为N,一次减1
s = (s + M - 1) % i; //计算下一个开始报数人的位置
if(s == 0)
s = i; //最后一个人出圈的位置存入变量s中
w = p[s - 1]; //讲出圈人的编号保存到变量w中
for(j=s; j<=i-1; j++) //从s位置开始,数组的内容依次前移
p[j-1] = p[j];
p[j-1] = w; //讲w存入到空的位置中
}
System.out.print("出圈人的顺序为:");
for(i=p.length-1; i>=0; i--)
System.out.print(p[i]+" ");
}
}
以上:在p[j-1] = w行中,小弟看不懂,j这个变量没有进行初始化,为什么还能进行j-1操作。在调试的时候,将j-1换成i-1,输出结果和j-1的结果一致。
疑问:p[j-1] = w 和 p[i-1] = w有什么区别,困扰了好久依然不懂,希望各位高人能给小弟指点迷津。谢谢