思路一:
回溯法递归求解:
1 import java.util.LinkedList; 2 import java.util.Scanner; 3 4 // N皇后问题 5 public class Solution1 { 6 public static int n; 7 public static int cnt = 0; // 统计组合总数 8 public static int[] arr; // arr[i]表示第i个皇后的列数,0表示第0个皇后 9 10 // 判断第k个皇后当前所在列是否和前面的皇后的位置有冲突 11 public static boolean place(int k, int col){ 12 for(int i = 0; i < k; i++){ 13 // 同一列或者行号之差等于列号之差则返回false 14 if(col == arr[i] || Math.abs(k - i) == Math.abs(col - arr[i])) 15 return false; 16 } 17 return true; 18 } 19 20 // 了利用回溯递归求解第k个皇后的位置 21 public static void FindNQueue(int k){ 22 if(k == n){ 23 cnt++; // 说明找到了一组可行解 24 for(int i : arr){ 25 System.out.print(i + " "); 26 } 27 System.out.println(); 28 return; 29 } 30 for(int i = 0; i < n; i++){ 31 if(place(k, i)){ // 如果第k个皇后可以放在第i列 32 arr[k] = i; // 第k个皇后的列号为i 33 FindNQueue(k + 1); // 放置下一个皇后 34 } 35 } 36 } 37 38 public static void main(String[] args) { 39 // 输入 40 Scanner in = new Scanner(System.in); 41 n = in.nextInt(); 42 arr = new int[n]; 43 44 // 求解 45 FindNQueue(0); 46 System.out.println(n + "皇后问题共有" + cnt + "种可行解"); 47 } 48 }
思路二:
回溯法非递归求解:
1 // 非递归回溯求解N皇后问题 2 public class Solution1_1 { 3 public static int n; 4 public static int[] arr; 5 public static int cnt = 0; 6 7 // 检查第k个皇后是否和前面的皇后有冲突 8 public static boolean place(int k){ 9 for(int i = 0; i < k; i++){ 10 if(arr[i] == arr[k] || Math.abs(k - i) == Math.abs(arr[i] - arr[k])) 11 return false; 12 } 13 return true; 14 } 15 16 // 回溯法求解 17 public static void findNQueen(){ 18 // 初始化arr[]数组 19 Arrays.fill(arr, -1); // 初始化每个皇后的位置都是-1 20 int k = 0; 21 22 while(k >= 0){ 23 arr[k] = arr[k] + 1; // 回溯回来后就将位置加一 24 // 查找第k个皇后的位置 25 while(arr[k] < n && (!place(k))) 26 arr[k]++; 27 if(arr[k] < n){ 28 if(k == n - 1){ // 找到一组解 29 cnt++; 30 for(int i = 0; i < n; i++) 31 System.out.print(arr[i] + " "); 32 System.out.println(); 33 }else{ 34 // 寻找下一个皇后的位置 35 k = k + 1; // 这个皇后还是从-1列开始查找自己的可行位置 36 } 37 }else{ 38 arr[k] = -1; // 重置当前皇后的位置 39 k--; // 回溯到上一个皇后 40 } 41 } 42 } 43 44 public static void main(String[] args) { 45 // 输入 46 Scanner in = new Scanner(System.in); 47 n = in.nextInt(); 48 arr = new int[n]; 49 findNQueen(); 50 // 求解(0); 51 System.out.println(n + "皇后问题共有" + cnt + "种可行解"); 52 } 53 54 }