Java 带有嵌套循环的 10x10 数组
Java 10x10 array with nested loop
我有一个 10x10 数组,我试图用嵌套循环填充它
int A[][] = new int [10][10];
到目前为止我已经创建了这个 -
C = 1;
for (i=0; i<=9; i++)
for (j=9-i; j>=7-i; j--)
if (j>=0) {
A[i][j] = C; C=C+1;
}
这是目前的result。
但我试图用两个 for 循环创建 this 但无法管理它。
感谢您的帮助!
这是我的版本。我从 Alex 的回答中借用了漂亮的 printf 格式 :)
我只想提两件事:
- 我认为如果将 i 和 j 称为 y 和 x 会更容易阅读
- 我好像记得,如果你需要性能,你需要沿着 x 轴遍历数组,因为这就是 CPU 获取缓存的方式(至少理论上是这样)。这会使算法有点复杂,但我想在这种情况下我们并不真正关心性能,所以在内部循环中使用 y 很好 :)
int dimension = 10;
int[][] result = new int[dimension][dimension];
int C = 27;
int yOffset = 9;
for (int x = 0; x < dimension; x++) {
for (int y = Math.min(2, yOffset); y >= 0 && yOffset - y >= 0; y--) {
result[yOffset - y][x] = C--;
}
yOffset--;
}
for (int[] y : result) {
for (int x : y) {
System.out.printf("%2d ", x);
}
System.out.println();
}
输出
0 0 0 0 0 0 0 6 3 1
0 0 0 0 0 0 9 5 2 0
0 0 0 0 0 12 8 4 0 0
0 0 0 0 15 11 7 0 0 0
0 0 0 18 14 10 0 0 0 0
0 0 21 17 13 0 0 0 0 0
0 24 20 16 0 0 0 0 0 0
27 23 19 0 0 0 0 0 0 0
26 22 0 0 0 0 0 0 0 0
25 0 0 0 0 0 0 0 0 0
这应该可以完成工作:
- 像往常一样从 0 到 10 迭代行,将列索引设置为 9 并减少它
- 在内循环中,设置从
i
到Math.max(i - beltWidth + 1, 0)
的范围(beltWidth
是列中非零值的最大计数,在本例中是3).
final int size = 10;
final int beltWidth = 3;
int A[][] = new int [size][size];
int c = 1;
for (int i = 0, j = size - 1; i < size; i++, j--) {
for (int k = i; k >= Math.max(i - beltWidth + 1, 0); k--) {
A[k][j] = c++;
}
}
for (int[] r : A) {
for (int x : r) {
System.out.printf("%2d ", x);
}
System.out.println();
}
输出
0 0 0 0 0 0 0 6 3 1
0 0 0 0 0 0 9 5 2 0
0 0 0 0 0 12 8 4 0 0
0 0 0 0 15 11 7 0 0 0
0 0 0 18 14 10 0 0 0 0
0 0 21 17 13 0 0 0 0 0
0 24 20 16 0 0 0 0 0 0
27 23 19 0 0 0 0 0 0 0
26 22 0 0 0 0 0 0 0 0
25 0 0 0 0 0 0 0 0 0
我有一个 10x10 数组,我试图用嵌套循环填充它
int A[][] = new int [10][10];
到目前为止我已经创建了这个 -
C = 1;
for (i=0; i<=9; i++)
for (j=9-i; j>=7-i; j--)
if (j>=0) {
A[i][j] = C; C=C+1;
}
这是目前的result。
但我试图用两个 for 循环创建 this 但无法管理它。
感谢您的帮助!
这是我的版本。我从 Alex 的回答中借用了漂亮的 printf 格式 :) 我只想提两件事:
- 我认为如果将 i 和 j 称为 y 和 x 会更容易阅读
- 我好像记得,如果你需要性能,你需要沿着 x 轴遍历数组,因为这就是 CPU 获取缓存的方式(至少理论上是这样)。这会使算法有点复杂,但我想在这种情况下我们并不真正关心性能,所以在内部循环中使用 y 很好 :)
int dimension = 10;
int[][] result = new int[dimension][dimension];
int C = 27;
int yOffset = 9;
for (int x = 0; x < dimension; x++) {
for (int y = Math.min(2, yOffset); y >= 0 && yOffset - y >= 0; y--) {
result[yOffset - y][x] = C--;
}
yOffset--;
}
for (int[] y : result) {
for (int x : y) {
System.out.printf("%2d ", x);
}
System.out.println();
}
输出
0 0 0 0 0 0 0 6 3 1
0 0 0 0 0 0 9 5 2 0
0 0 0 0 0 12 8 4 0 0
0 0 0 0 15 11 7 0 0 0
0 0 0 18 14 10 0 0 0 0
0 0 21 17 13 0 0 0 0 0
0 24 20 16 0 0 0 0 0 0
27 23 19 0 0 0 0 0 0 0
26 22 0 0 0 0 0 0 0 0
25 0 0 0 0 0 0 0 0 0
这应该可以完成工作:
- 像往常一样从 0 到 10 迭代行,将列索引设置为 9 并减少它
- 在内循环中,设置从
i
到Math.max(i - beltWidth + 1, 0)
的范围(beltWidth
是列中非零值的最大计数,在本例中是3).
final int size = 10;
final int beltWidth = 3;
int A[][] = new int [size][size];
int c = 1;
for (int i = 0, j = size - 1; i < size; i++, j--) {
for (int k = i; k >= Math.max(i - beltWidth + 1, 0); k--) {
A[k][j] = c++;
}
}
for (int[] r : A) {
for (int x : r) {
System.out.printf("%2d ", x);
}
System.out.println();
}
输出
0 0 0 0 0 0 0 6 3 1
0 0 0 0 0 0 9 5 2 0
0 0 0 0 0 12 8 4 0 0
0 0 0 0 15 11 7 0 0 0
0 0 0 18 14 10 0 0 0 0
0 0 21 17 13 0 0 0 0 0
0 24 20 16 0 0 0 0 0 0
27 23 19 0 0 0 0 0 0 0
26 22 0 0 0 0 0 0 0 0
25 0 0 0 0 0 0 0 0 0