• N皇后问题


    思路一:

    回溯法递归求解:

     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 }
  • 相关阅读:
    js 判断多个一样的name
    VisualSVN Server的配置和使用方法 图文
    file get contents 访问不了域名原因
    js confirm函数 删除提示
    关于PHP的curl开启问题
    重置svn地址
    google 火狐 模拟显示手机页面插件
    开启Apache mod_rewrite模块完全解答
    zend studio 9.0.4 破解、汉化和字体颜色及快捷键相关设置
    zend studio 8 修字体和大小
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/13055276.html
Copyright © 2020-2023  润新知