zoukankan      html  css  js  c++  java
  • 回溯(su)算法之N皇后问题

    这里回溯算法还要好好研究一下

    试探一个位置是否有效,如果有效,试探下一个位置(DFS),如果无效则回退

    1.定义一个解空间,存放一个解的空间

    2.DFS(暂且认为是DFS)

    这里N皇后用的是递归+回溯实现的

     1 package com.gxf.backtracking;
     2 
     3 /**
     4  * n皇后问题
     5  * @author Administrator
     6  *
     7  */
     8 public class Queen {
     9     int num_queen;                                    //皇后个数
    10     int solution[];                                    //solution[i] = k表示第i行皇后在第k列    ,solution为解空间
    11     int sum = 0;
    12     
    13     public Queen(int num){
    14         num_queen = num;
    15         solution = new int[num_queen + 1];
    16     }
    17     
    18     /**
    19      * 第k个皇后的位置是否有效
    20      * 第k个皇后的列保存在solution[k]中,与前面k-1个皇后比较
    21      * @param k
    22      * @return
    23      */
    24     boolean isValid(int k){
    25         for(int i = 1; i < k; i++){
    26             if(solution[i] == solution[k] || Math.abs(k - i) == Math.abs(solution[k] - solution[i]))
    27                 return false;            
    28         }
    29         return true;
    30     }
    31     
    32     /**
    33      * 开始放第n个皇后
    34      * @param queen
    35      */
    36     public void placeQueen(int n){
    37         if(n > num_queen)
    38         {
    39             showSolution();
    40             System.out.println();
    41             sum++;
    42         }
    43         else
    44             for(int i = 1; i <= num_queen; i++){
    45                 solution[n] = i;                        //n个皇后放到i列 
    46                 if(isValid(n))
    47                     placeQueen(n + 1);
    48             }
    49     }
    50     
    51     /**
    52      * 将结果打印出来
    53      */
    54     public void showSolution(){
    55         for(int i = 1; i <= num_queen; i++){
    56             for(int j = 1; j <= num_queen; j++){
    57                 if(j == solution[i])
    58                     System.out.print('Q' + " ");
    59                 System.out.print(0 + " ");
    60             }
    61             System.out.println();
    62         }
    63     }
    64     
    65     public static void main(String[] args) {
    66         Queen queen = new Queen(4);
    67         
    68         queen.placeQueen(1);
    69         System.out.println("sum = " + queen.sum);
    70     }
    71 
    72 }

  • 相关阅读:
    js弹出遮罩层
    委托集合使用
    C#动态属性(.NET Framework4.5支持)
    ABP项目启动及源代码结构
    ABP项目概述
    Visual Studio 2017调试开源项目代码
    GIT的前世今生
    近期上海面试总结(二)
    近期上海面试总结(一)
    一个基于反射的消息发布订阅模型详解
  • 原文地址:https://www.cnblogs.com/luckygxf/p/4119605.html
Copyright © 2011-2022 走看看