该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
public static void main(String[] args) {
// for (int i = 0; i < 10; i++) {
// System.out.println(Arrays.toString(getPosition(i)));
// }
int[][] ps = getAll(20);
for (int i = ps.length; i > 0; i--) {
int[] p = ps[i - 1];
System.out.println(Arrays.toString(p));
}
}
public static int[][] getAll(int n) {
int c = (int) Math.sqrt(n);
if ((c ^ 1) == 1) {
c--;
}
c = (c + 1) / 2 + 1;//
int w = 2 * c - 1;
int[][] ps = new int[w][w];
for (int i = 0; i <= n; i++) {
int[] p = getPosition(i);
ps[p[1] + c - 1][p[0] + c - 1] = i;
}
return ps;
}
public static int[] getPosition(int n) {
int[] p = new int[] { 0, 0 };
if (n > 0) {
int c = (int) Math.sqrt(n);
if ((c ^ 1) == 1) {
c--;
}
c = (c + 1) / 2;//
int remain = n - (int) Math.pow(2 * c - 1, 2);
int i = remain / (2 * c);
int j = remain % (2 * c);
p[(i + 1) % 2] += Math.pow(-1, i < 2 ? 0 : 1) * (c);
p[i % 2] += Math.pow(-1, (i > 0 && i < 3) ? 0 : 1) * (c - 1);
p[i % 2] += Math.pow(-1, (i > 0 && i < 3) ? 1 : 0) * (j);
}
return p;
}