让我们从找出细胞在哪个“圆”中开始。也就是说,螺旋在撞击这个单元之前多久完全旋转一次:
int n = min(x, y, M - x - 1, N - y - 1);
第一个完整的回合由2*M + N) - 4
细胞组成,下一个由2*(M + N) - 12
细胞组成,依此类推(我希望你相信我)。更一般地说,轮i
由2*(M + N - 2) - 8*i
单元组成。
n
那么第一轮有多少个细胞呢?只需将刚刚找到的值相加即可:
sum(0 <= i < n : 2*(M + N - 2) - 8*i) = 2*n*(M + N - 2) - 8 * sum(0 <= i < n : i)
= 2*n*(M + N - 2) - 8 * n * (n - 1) / 2
= 2*n*(M + N - 2*n)
我们已经可以将此值添加到索引中:
int index = 2 * n * (M + N - 2 * n);
现在我们只需要检查当前回合中单元格的位置:
if (n == y) {
// top of this round
index += x - n;
} else {
// add full top of this round
index += M - 2 * n;
if (n == M - x - 1) {
// right side of this round
index += y - (n + 1);
} else {
// add full right side of this round
index += N - 2 * n - 1;
if (n == N - y - 1) {
// bottom of this round
index += N - x - 1 - (n + 1);
} else {
// add full bottom of this round
index += M - 2 * n - 1;
// left side of this round
index += M - y - 1 - (n+1);
}
}
}
我调用了该方法spiral(M, N, x, y)
并按如下方式运行它:
System.out.println(spiral(3, 3, 0, 0));
System.out.println(spiral(3, 3, 1, 0));
System.out.println(spiral(3, 3, 2, 0));
System.out.println(spiral(3, 3, 2, 1));
System.out.println(spiral(3, 3, 2, 2));
System.out.println(spiral(3, 3, 1, 2));
System.out.println(spiral(3, 3, 0, 2));
System.out.println(spiral(3, 3, 0, 1));
System.out.println(spiral(3, 3, 1, 1));
这导致
0
1
2
3
4
5
6
7
8