我正在尝试解决以下问题:"写一个算法来打印在8x8棋盘上排列8个皇后的所有方法,这样它们就不会共享相同的行,列或对角线(即没有两个女王互相攻击。)"
我无法理解为什么作者使用Integer []而不是更常见的int [],例如在" Integer []列"和" ArrayList结果"这是placeQueens的参数。我的假设是,这是由于Java中的泛型,但我并不完全确定。
下面的代码段。链接到页面底部的完整代码。
public static int GRID_SIZE = 8;
/* Check if (row1, column1) is a valid spot for a queen by checking if there
* is a queen in the same column or diagonal. We don't need to check it for queens
* in the same row because the calling placeQueen only attempts to place one queen at
* a time. We know this row is empty.
*/
public static boolean checkValid(Integer[] columns, int row1, int column1) {
for (int row2 = 0; row2 < row1; row2++) {
int column2 = columns[row2];
/* Check if (row2, column2) invalidates (row1, column1) as a queen spot. */
/* Check if rows have a queen in the same column */
if (column1 == column2) {
return false;
}
/* Check diagonals: if the distance between the columns equals the distance
* between the rows, then they're in the same diagonal.
*/
int columnDistance = Math.abs(column2 - column1);
int rowDistance = row1 - row2; // row1 > row2, so no need to use absolute value
if (columnDistance == rowDistance) {
return false;
}
}
return true;
}
public static void placeQueens(int row, Integer[] columns, ArrayList<Integer[]> results) {
if (row == GRID_SIZE) { // Found valid placement
results.add(columns.clone());
} else {
for (int col = 0; col < GRID_SIZE; col++) {
if (checkValid(columns, row, col)) {
columns[row] = col; // Place queen
placeQueens(row + 1, columns, results);
}
}
}
}
问题/代码来源:破解编码面试。链接到完整代码:https://github.com/gaylemcd/ctci/blob/master/java/Chapter%209/Question9_9/Question.java
答案 0 :(得分:2)
在Java中,Integer
表示对象,而int
是基本类型。 Integer
类支持更多功能,可以保留null
个值。此外,ArrayList
只能包含Integer
等对象。
ArrayList<int[]> results = new ArrayList<int[]>();
在上面的修订代码中,int[]
仍然有效,因为它被视为一个对象。但是,作者可能正在寻求一致性或需要Integer
对象的额外功能。这是作者的偏好或无知的问题。
答案 1 :(得分:0)
您可能认为主要的第一行(来自您提供的链接):
ArrayList<Integer[]> results = new ArrayList<Integer[]>();
必须使用整数,但正如评论所暗示的那样,情况并非如此。
ArrayList<int[]> results = new ArrayList<int[]>();
也会奏效。因此,在这种情况下,这只是作者的偏好。