1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| package algorithm;
import java.util.*;
public class NQueensII {
public static int totalNQueens(int n) {
int[] queens = new int[n]; Arrays.fill(queens, -1); Set<Integer> columns = new HashSet<>(); Set<Integer> diagonals1 = new HashSet<>(); Set<Integer> diagonals2 = new HashSet<>();
// 从第0行开始 return track(queens, n, 0, columns, diagonals1, diagonals2); }
private static Integer track(int[] queens, int n, int row, Set<Integer> columns, Set<Integer> diagonals1, Set<Integer> diagonals2) {
if (row == n) { return 1; } else { int count = 0; // 每一行都要从第0列开始遍历 for (int i = 0; i < n; i++) { if (columns.contains(i)) { continue; } int diagonal1 = row - i; if (diagonals1.contains(diagonal1)) { continue; } int diagonal2 = row + i; if (diagonals2.contains(diagonal2)) { continue; } queens[row] = i; columns.add(i); diagonals1.add(diagonal1); diagonals2.add(diagonal2); count += track(queens, n, row + 1, columns, diagonals1, diagonals2); queens[row] = -1; columns.remove(i); diagonals1.remove(diagonal1); diagonals2.remove(diagonal2); } return count; } }
public static void main(String[] args) { System.out.println(totalNQueens(4));
System.out.println(totalNQueens(1)); } }
|