Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
Code:
/**
*
*/
package From41;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* @author MohnSnow
* @time 2015年6月25日 下午5:39:39
* @translate 求解的数目
*
*/
public class LeetCode52 {
/**
* @param argsmengdx
* -fnst
*/
private final static Set<Integer> occupiedCols = new HashSet<Integer>();
private final static Set<Integer> occupiedDiag1s = new HashSet<Integer>();
private final static Set<Integer> occupiedDiag2s = new HashSet<Integer>();
//252msAC
public static int totalNQueens2(int n) {
return totalNQueensHelper(0, 0, n);
}
private static int totalNQueensHelper(int row, int count, int n) {
for (int col = 0; col < n; col++) {
if (occupiedCols.contains(col))
continue;
int diag1 = row - col;
if (occupiedDiag1s.contains(diag1))
continue;
int diag2 = row + col;
if (occupiedDiag2s.contains(diag2))
continue;
// we can now place a queen here
if (row == n - 1)
count++;
else {
occupiedCols.add(col);
occupiedDiag1s.add(diag1);
occupiedDiag2s.add(diag2);
count = totalNQueensHelper(row + 1, count, n);
// recover
occupiedCols.remove(col);
occupiedDiag1s.remove(diag1);
occupiedDiag2s.remove(diag2);
}
}
return count;
}
public static int result = 0;
public static int totalNQueens(int n) {
int[] temp = new int[n];
solveNQueens(temp, n, 0);
return result;
}
public static void solveNQueens(int[] temp, int n, int last) {
if (last == n) {
//System.out.println("result1: " + result);
result++;
//System.out.println("result2: " + result);
} else {
for (int i = 0; i < n; i++) {
//System.out.println("last: " + last + " i:" + i);
temp[last] = i;
if (isValid(temp, last)) {
solveNQueens(temp, n, last + 1);
continue;
}
}
}
}
public static boolean isValid(int[] temp, int last) {
for (int i = 0; i < last; i++) {
if (temp[i] == temp[last] || Math.abs(temp[last] - temp[i]) == last - i) {
return false;
}
}
return true;
}
public static void main(String[] args) {
int n = 8;
System.out.println("QueenTotal: " + totalNQueens(n));
System.out.println("QueenTotal: " + totalNQueens2(n));
}
}