代码如下:
import java.util.Scanner;
//通过数组建树
public class Main {
static boolean tree[] = new boolean[1000010];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int d = sc.nextInt();
int num =(int)( Math.pow(2, n-1)-1);
int res = 0;
for(int i = 1; i <= d; i++) {
int j = 1;
while(j <= num) {
if(tree[j]) {
tree[j] = !tree[j];
j = 2 * j + 1;
}else {
tree[j] = !tree[j];
j = 2 * j;
}
}
res = j;
}
System.out.println(res);
}
}
题意给的是如果小球到达的这个点是false,那么先将这个点改为true,再向它的左儿子走;如果这个点是true,则先将它改为false,再向它的右儿子走,直到走到第n层,看这个球会停留在哪个点。
我解题的思路是用一个boolean类型的数组来建立一个树的模型,比如上图给的例子:
第一个球的运动轨迹是1,2,4,8。根节点用i=1代替,一开始这个点为false,我们将它改为true,并且改变i,i = i * 2,这个时候我们就走到了2这个位置,由于2这个点也为false,先改变为true,再改i,i = i * 2 ,我们就走到了左边4这个位置,以此类推......