状态压缩
class Solution {
int n;
int[] res;
int count = 0;
public int totalNQueens(int n) {
this.n = n;
this.res = new int[n];
check(0);
return count;
}
public void check(int k) {
if(k == n) {
count++;
return;
}
for(int i = 0; i < n; i++) {
res[k] = i;
if(!judge(k)) {
check(k+1);
}
}
}
public boolean judge(int k) {
for(int i = 0; i < k; i++) {
if(res[k] == res[i] || Math.abs(k-i) == Math.abs(res[k]-res[i])) {
return true;
}
}
return false;
}
}
非状态压缩
public class Nqueen {
public static List<List<String>> list = new ArrayList<>();
public static void main(String args[]) {
solveNQueens(4);
}
public static List<List<String>> solveNQueens(int n) {
long t1 = System.currentTimeMillis();
int a[][] = new int[n][n];
solve(a, n, 0);
long t2 = System.currentTimeMillis();
System.out.println("耗时 " + (t2 - t1) + " ms");
return list;
}
public static void solve(int a[][], int n, int num) {
if (num == n) {
addList(a);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
return;
}
for (int j = 0; j < n; j++) {
if (a[num][j] == 0 && ifDown(a, num, j, n)) {
a[num][j] = 1;
solve(a, n, num + 1);
a[num][j] = 0;
}
}
}
public static void addList(int a[][]) {
List<String> li = new ArrayList<>();
for (int i = 0; i < a.length; i++) {
StringBuilder str = new StringBuilder();
for (int j = 0; j < a.length; j++) {
if (a[i][j] == 0) str.append('.');
else if (a[i][j] == 1) str.append('Q');
}
li.add(str.toString());
}
list.add(li);
}
public static boolean ifDown(int a[][], int x, int y, int n) {
for (int i = x; i >= 0; i--) {
if (a[i][y] != 0) return false;
}
for (int i = x, j = y; i >= 0 && j >= 0; i--, j--) {
if (a[i][j] != 0) return false;
}
for (int i = x, j = y; i >= 0 && j < n; i--, j++) {
if (a[i][j] != 0) return false;
}
return true;
}
}