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根节点出发深度探索解空间树。当探索到某一接点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索,如果该结点不包含问题的解,则逐层想其祖先结点回溯。(回溯法就是对隐式的深度优先搜索算法)
    若用回溯法求解问题的所有解时,要回溯到根,且根节点的所有可行的子树都已经被所有遍才结束。而使用回溯法求解任一个解时,只要搜索到问题的一个解就可以结束。

  • 相关阅读:
    C语言枚举类型使用简介
    C实现单链表(转)
    不同数据库数据类型
    Informix 常用命令
    工作了
    修改route使用有线/无线同时连接内外网
    Perl 时间函数
    Linux 系统命令
    SQL SERVER 触发器示例
    Informix 函数
  • 原文地址:https://www.cnblogs.com/caopt/p/7749918.html
Copyright © 2011-2022 走看看