這道題是51 N-Queens的延伸把还,只要求返回方案的個數(shù)协屡,不需要返回具體的方案俏脊。
自己初看這道題時,覺得只要按照51的方法求肤晓,最后返回list的size就可以了爷贫。看了discuss討論中投票較高的答案后补憾,不禁覺得自己的想法太low了漫萄。沒有利用到在上道題學到的判斷條件,因為不需要輸出具體的方案盈匾,所以每次搜索時只需要判斷當前位置是否合法即可以腾务,每一個合法方案把count數(shù)加1。
在判斷條件的地方削饵,自以為聰明的用了set.add的方法岩瘦,導致程序出現(xiàn)bug。bug的原因就是要確保直線和兩種斜線條件都滿足的情況下窿撬,才能將直線启昧、兩種斜線值add到set中。索引只能先都用contains方法判斷劈伴,條件都成立的話箫津,再一起add。
HashSet<Integer> visitCols = new HashSet<>();
HashSet<Integer> visitLeftDias = new HashSet<>();
HashSet<Integer> visitRightDias = new HashSet<>();
int count = 0;
int n = 0;
public int totalNQueens(int n) {
if (n <= 0) {
return 0;
}
this.n = n;
helper(0);
return count;
}
public void helper(int row) {
if (row == n) {
count++;
return;
}
for (int col = 0; col < n; col++) {
/* 最初版本的bug
if (!visitCols.add(col)) {
continue;
}
int leftDia = row - col;
if (!visitLeftDias.add(leftDia)) {
continue;
}
int rightDia = row + col;
if (!visitRightDias.add(rightDia)) {
continue;
}
*/
if (visitCols.contains(col)) {
continue;
}
int leftDia = row - col;
if (visitLeftDias.contains(leftDia)) {
continue;
}
int rightDia = row + col;
if (visitRightDias.contains(rightDia)) {
continue;
}
visitCols.add(col);
visitLeftDias.add(leftDia);
visitRightDias.add(rightDia);
helper(row + 1);
visitCols.remove(col);
visitLeftDias.remove(leftDia);
visitRightDias.remove(rightDia);
}
}