Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
https://oj.leetcode.com/problems/n-queens-ii/
思路:参考N-Queens,只统计个数即可。
public class Solution {
public int totalNQueens(int n) {
if (n <= 0)
return 0;
int[] perm = new int[n];
slove(perm, 0, n);
return count;
}
private int count = 0;
private void slove(int[] perm, int cur, int n) {
if (cur == n) {
count++;
} else {
int i;
for (i = 0; i < n; i++) {
int j;
boolean ok = true;
for (j = 0; j < cur; j++) {
if (perm[j] == i || perm[j] - j == i - cur
|| perm[j] + j == i + cur)
ok = false;
}
if (ok) {
perm[cur] = i;
slove(perm, cur + 1, n);
}
}
}
}
public static void main(String[] args) {
System.out.println(new Solution().totalNQueens(8));
}
}
第二遍记录:判断冲突的条件搞错了, cur和i代表什么不要搞错了。
cur代表当前要填皇后的行, i表示第cur行要在第i列填入。
所以j循环条件是 j<cur,不是i。
public class Solution { private int count; public int totalNQueens(int n) { if(n<=0) return 0; int[] perm = new int[n]; totalCount(perm,0); return count; } private void totalCount(int[] perm,int cur){ if(cur==perm.length){ count++; return; } for(int i=0;i<perm.length;i++){ boolean ok= true; for(int j=0;j<cur;j++){ if(perm[j]==i||perm[j]-j==i-cur||perm[j]+j==i+cur){ ok=false; break; } } if(ok){ perm[cur]=i; totalCount(perm,cur+1); } } } }