我有一个任务,要以特定的方式填充二维数组,因此它应该产生如图所示的输出,例如:
1 0 0 0 0 0 1
0 1 0 0 0 1 0
0 0 1 0 1 0 0
0 0 0 1 0 0 0
0 0 1 0 1 0 0
0 1 0 0 0 1 0
1 0 0 0 0 0 1
这就是我所做的,并且效果很好:
public class TwoDArrays {
public static void main(String[] args) {
FillUpTwoDArray(7, 7);
}
public static void FillUpTwoDArrays(int rows, int columns) {
int twoD[][] = new int[rows][columns];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
twoD[i][j] = 0;
if (i == j) {
twoD[i][j] = 1;
}
if (i + j == rows - 1) {
twoD[i][j] = 1;
}
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++)
System.out.print(twoD[i][j] + " ");
System.out.println();
}
}
...
}
我的头痛从这里开始:
1 1 1 1 1 1 1
0 1 1 1 1 1 0
0 0 1 1 1 0 0
0 0 0 1 0 0 0
0 0 1 1 1 0 0
0 1 1 1 1 1 0
1 1 1 1 1 1 1
也许某人的逻辑看起来很明显,但是我完全不知道如何向JVM解释这一点。我不要求您提供解决方案的答案,有些提示会很完美,在此先感谢您!
答案 0 :(得分:2)
因此,您需要做的是攻击已经在打印的对角线内存在的其他边界条件。第一个边界定义为列索引大于行索引但小于行长减去行索引的区域:
for (int k = j; k < twoD[i].length - i; k++) {
if (k > i) {
twoD[i][k] = 1;
}
}
三角形的下部较硬。边界定义为列索引位于行索引和行长度之间的区域,减去行索引,负1:
for (int h = j; h < twoD[i].length; h++) {
if (h < i && j > (rows - i - 1)) {
twoD[i][h] = 1;
}
}
连同其余代码一起,解决方案(或更确切地说是解决方案;我不认为这是经过优化的)将是:
public class TwoDArrays {
public static void main(String[] args) {
FillUpTwoDArrays(7, 7);
}
public static void FillUpTwoDArrays(int rows, int columns) {
int twoD[][] = new int[rows][columns];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
twoD[i][j] = 0;
for (int k = j; k < twoD[i].length - i; k++) {
if (k > i) {
twoD[i][k] = 1;
}
}
if (i == j) {
twoD[i][j] = 1;
}
if (i + j == rows - 1) {
twoD[i][j] = 1;
}
for (int h = j; h < twoD[i].length; h++) {
if (h < i && j > (rows - i - 1)) {
twoD[i][h] = 1;
}
}
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++)
System.out.print(twoD[i][j] + " ");
System.out.println();
}
}
}