码迷,mamicode.com
首页 > 其他好文 > 详细

N皇后问题

时间:2020-06-06 17:01:49      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:print   port   solution   string   ==   数组   tin   回溯   lis   

思路一:

回溯法递归求解:

 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 }

 

N皇后问题

标签:print   port   solution   string   ==   数组   tin   回溯   lis   

原文地址:https://www.cnblogs.com/hi3254014978/p/13055276.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!