zoukankan      html  css  js  c++  java
  • 八皇后问题

    八皇后问题,是一个古老问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 = 1 或 n1 ≥ 3 时问题有解。

    下面是java实现代码

     1 package test;
     2 
     3 import org.junit.Test;
     4 
     5 /**
     6  * 八皇后问题,是一个古老问题,是回溯算法的典型案例。
     7  * 该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:
     8  * 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,
     9  * 即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
    10  * 八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 = 1 或 n1 ≥ 3 时问题有解。12  * 回溯算法:回溯算法也叫试探法,通俗的将就是一个方向的路一直往前走,能走则走,不能走则退回来换一个方向再试。
    13  * 一般的实现步骤是:针对一个问题定义解的空间,至少包含问题的一个最优解;
    14  * 用易于搜索的解空间结构,使得能用回溯方法搜索整个解空间;以深度优先的方式搜索整个解空间,并在搜索过程中通过剪枝函数避免无效搜索。
    15  */
    16 public class EightQueens {
    17     public int Queens(int[] col,int n,int row){
    18         if(row==n)return 1;//当一开始行等于列时
    19         int num = 0;
    20         //从第一列开始循环列
    21         for(int i = 0;i < n;i++){
    22             col[row] = i;
    23             boolean flag = false;
    24             //从第一行开始循环行
    25             for(int j = 0;j<row;j++){
    26                 //判断是否冲突 同一列判断col[j]==col[row]  同一斜线判断 Math.abs(col[j]-col[row])==Math.abs(j-row)
    27                 if(col[j]==col[row]||Math.abs(col[j]-col[row])==Math.abs(j-row)){
    28                     flag=true;
    29                 }
    30             }
    31             if(!flag){
    32                 num+=Queens(col,n,row+1);
    33             }
    34         }
    35         return num;
    36     }
    37     @Test
    38     public void test(){
    39         //8皇后问题
    40         System.out.println(Queens(new int[8],8,0));;
    41     }
    42 }

    输出结果是92种

    1.回溯算法

    回溯算法也叫试探法,通俗的将就是一个方向的路一直往前走,能走则走,不能走则退回来换一个方向再试。一般的实现步骤是:针对一个问题定义解的空间,至少包含问题的一个最优解;用易于搜索的解空间结构,使得能用回溯方法搜索整个解空间;以深度优先的方式搜索整个解空间,并在搜索过程中通过剪枝函数避免无效搜索。

    回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
    回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
    许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。
    2.基本思想
    在包含问题的所有解的解空间树中,按照蛇毒有限搜索的策略,control根节点出发深度探索解空间树。当探索到某一接点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索,如果该结点不包含问题的解,则逐层想其祖先结点回溯。(回溯法就是对隐式的深度优先搜索算法)
    若用回溯法求解问题的所有解时,要回溯到根,且根节点的所有可行的子树都已经被所有遍才结束。而使用回溯法求解任一个解时,只要搜索到问题的一个解就可以结束。

  • 相关阅读:
    不常用的cmd命令
    js获取宽度
    Marshaling Data with Platform Invoke 概览
    Calling a DLL Function 之三 How to: Implement Callback Functions
    Marshaling Data with Platform Invoke 之四 Marshaling Arrays of Types
    Marshaling Data with Platform Invoke 之一 Platform Invoke Data Types
    Marshaling Data with Platform Invoke 之三 Marshaling Classes, Structures, and Unions(用时查阅)
    Calling a DLL Function 之二 Callback Functions
    WCF 引论
    Marshaling Data with Platform Invoke 之二 Marshaling Strings (用时查阅)
  • 原文地址:https://www.cnblogs.com/caopt/p/7749918.html
Copyright © 2011-2022 走看看