您如何解决任何编码问题?一步一个脚印。
按照你图片中的路径,我们列出前几个整数数组下标。
0, 7
0, 6
1, 7
2, 7
1, 6
0, 5
0, 4
1, 5
2, 6
3, 7
您需要列出足够多的下标才能看到发展的模式。
一种可能的解决方案是将下标编码到不同的数组中。不幸的是,此解决方案会将您锁定在 8 x 8 矩阵中。
所以,让我们编写一些代码来获取矩阵的前几个值。它不会是漂亮的代码。我们仍在尝试找出模式。
import java.util.Arrays;
public class ArrayWalk {
public static void main(String args[]) {
int height = 8;
int width = 8;
ArrayWalk aw = new ArrayWalk();
int[][] myArray = aw.createArray(height, width);
int[] values = aw.walkArray(myArray);
System.out.println(Arrays.toString(values));
}
private int[][] createArray(int height, int width) {
int[][] myArray = new int[height][width];
int start = 0;
for (int h = 0; h < height; h++) {
for (int w = 0; w < width; w++) {
myArray[h][w] = start;
start++;
}
}
return myArray;
}
private int[] walkArray(int[][] myArray) {
int height = myArray.length;
int width = myArray[0].length;
int length = height * width;
int[] values = new int[length];
int index = 0;
int h = 0;
int w = width - 1;
values[index++] = myArray[h][w];
w--;
values[index++] = myArray[h][w];
h++;
w++;
values[index++] = myArray[h][w];
h++;
values[index++] = myArray[h][w];
h--;
w--;
values[index++] = myArray[h][w];
h--;
w--;
values[index++] = myArray[h][w];
w--;
values[index++] = myArray[h][w];
h++;
w++;
values[index++] = myArray[h][w];
h++;
w++;
values[index++] = myArray[h][w];
h++;
w++;
values[index++] = myArray[h][w];
h++;
values[index++] = myArray[h][w];
h--;
w--;
values[index++] = myArray[h][w];
h--;
w--;
values[index++] = myArray[h][w];
h--;
w--;
values[index++] = myArray[h][w];
h--;
w--;
values[index++] = myArray[h][w];
return values;
}
}
如您所见,我们已经确定需要设置矩阵的宽度和高度,并且需要返回一个整数数组来保存矩阵值。
到目前为止,一切都很好。
更重要的是,我们看到了一种模式的发展。我们只看下标。
w--
h++
w++ (once)
h++
h--
w-- (twice)
此模式重复,但双下标重复一次、两次、三次,最多七次(宽度 - 一次)。然后双下标重复六、五、四等次。
顶行和底行总是向左移动。第一列和最后一列总是向下移动。
现在,在这一点上,我不确定我刚才所说的是否适用于矩形矩阵。我很确定它适用于方阵。
让我们用我们获得的知识编写一个辅助方法。这种模式是工厂模式。
private Dimension[] createIncrements() {
Dimension[] increments = new Dimension[4];
increments[0] = new Dimension(-1, 0);
increments[1] = new Dimension(1, 1);
increments[2] = new Dimension(0, 1);
increments[3] = new Dimension(-1, -1);
return increments;
}
java.awt.Dimension 包含一个宽度和一个高度。因此,我们定义了在 Code Pattern 中看到的四个增量。然后我们可以循环通过这些增量。诀窍是跟踪我们需要使用第一个和第三个(从零开始的)增量来增加多少次。我们必须从 1 数到 7,然后再倒数到 1。
我已经尝试了几个小时。这是一个很难解决的问题。明天我会从上次停下的地方继续。
希望到目前为止我给您的描述对您有所帮助。
编辑添加:我不确定我是否会在其他答案中提出算法。我最终所做的只是编写一些代码来测试不同的数组大小。
这是一项测试的结果。
-------------------
| 0 | 1 | 2 |
-------------------
| 3 | 4 | 5 |
-------------------
| 6 | 7 | 8 |
-------------------
[2, 1, 5, 8, 4, 0, 3, 7, 6]
另一个测试
-------------------------------
| 0 | 1 | 2 | 3 | 4 |
-------------------------------
| 5 | 6 | 7 | 8 | 9 |
-------------------------------
[4, 3, 9, 8, 2, 1, 7, 6, 0, 5]
最后,图片中的 8 x 8 测试。
-------------------------------------------------
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
-------------------------------------------------
| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
-------------------------------------------------
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
-------------------------------------------------
| 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
-------------------------------------------------
| 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
-------------------------------------------------
| 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
-------------------------------------------------
| 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
-------------------------------------------------
| 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
-------------------------------------------------
[7, 6, 15, 23, 14, 5, 4, 13, 22, 31, 39, 30, 21, 12, 3, 2, 11, 20, 29, 38,
47, 55, 46, 37, 28, 19, 10, 1, 0, 9, 18, 27, 36, 45, 54, 63, 62, 53, 44, 35,
26, 17, 8, 16, 25, 34, 43, 52, 61, 60, 51, 42, 33, 24, 32, 41, 50, 59, 58,
49, 40, 48, 57, 56]
这是代码。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class ArrayWalk {
public static void main(String args[]) {
int height = 8;
int width = 8;
ArrayWalk aw = new ArrayWalk();
int[][] myArray = aw.createArray(height, width);
System.out.println(aw.printArray(myArray));
int[] values = aw.walkArray(myArray);
System.out.println(Arrays.toString(values));
}
private int[][] createArray(int height, int width) {
int[][] myArray = new int[height][width];
int start = 0;
for (int h = 0; h < height; h++) {
for (int w = 0; w < width; w++) {
myArray[h][w] = start;
start++;
}
}
return myArray;
}
private int[] walkArray(int[][] myArray) {
int totalRows = myArray.length;
int totalCols = myArray[0].length;
List<Integer> res = new ArrayList<>(totalRows * totalCols);
List<Integer> diagonal = new ArrayList<>(
Math.max(totalRows, totalCols));
boolean reverseOrder = true;
for (int col = totalCols - 1; col >= 0; col--) {
for (int row = 0; row < totalRows && col + row < totalCols; row++) {
diagonal.add(myArray[row][col + row]);
}
if (reverseOrder) {
Collections.reverse(diagonal);
}
res.addAll(diagonal);
reverseOrder = !reverseOrder;
diagonal.clear();
}
for (int row = 1; row < totalRows; row++) {
for (int col = 0; col < totalCols && col + row < totalRows; col++) {
diagonal.add(myArray[col + row][col]);
}
if (reverseOrder) {
Collections.reverse(diagonal);
}
res.addAll(diagonal);
reverseOrder = !reverseOrder;
diagonal.clear();
}
int[] output = new int[res.size()];
for (int i = 0; i < res.size(); i++) {
output[i] = res.get(i);
}
return output;
}
private String printArray(int[][] myArray) {
String output = "";
for (int h = 0; h < myArray.length; h++) {
output += printDashes(myArray[h].length) + "\n";
output += printLine(myArray[h]) + "\n";
}
output += printDashes(myArray[0].length) + "\n";
return output;
}
private String printDashes(int width) {
int count = width * 6 + 1;
String output = "";
for (int i = 0; i < count; i++) {
output += "-";
}
return output;
}
private String printLine(int[] array) {
String output = "|";
for (int i = 0; i < array.length; i++) {
String value = String.format("%3d", array[i]);
output += " " + value + " |";
}
return output;
}
}