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

    概念介绍

      有同学想了解八皇后问题,今天它来了!先请百度百科,为我们介绍什么是八皇后问题?

      该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

      来一张高清无码大图,是不是看起来更直观了。

      

    代码实现

      思路分析:1.从第一行第一列开始放置皇后。

           2.从第二行第一列至第二行第八列开始放置不会相互冲突的皇后,直至放满八行。

           3.重复上述操作,毕竟第一行摆放皇后的位置就有八种。

      第一步:设置存放皇后位置的棋盘及相关变量。

    1     // 定义皇后的个数,这里取8
    2     int max = 8;
    3     // 用于存储皇后的位置,比如 result = {0 , 5, 7, 2, 6, 3, 1, 4}
    4     // 上述例子result表示,第一行的皇后在第1个位置,第二行的皇后在第6个位置,依次类推
    5     int[] result = new int[max];
    6     // 用来记录摆放皇后的解法的数量
    7     static int count = 0;

      第二步:实现判断是否会发生相互攻击的方法,这是核心点之一,判断是否会攻击的原则在注释中已经分析了。

     1    /**
     2      * Description:该方法用来判断皇后是否会相互攻击
     3      * @param n 表示第n个皇后,也就是第n行的皇后
     4      * @return
     5      */
     6     private boolean notAttackEachOther(int n) {
     7         // 说明:假设n=3.我们需要与第1层与第2层的皇后进行攻击判断
     8         // 判断是否会攻击的原则:
     9         //      1.同行:不会发生冲突,每次放置n都会+1,即第n层放置完毕后,就会去放置n+1层
    10         //      2.同列:假设第3层我们放到的是第3个位置,如果第1层与第3层皇后发生冲突
    11         //              那么有result[0] == result[2],所以同列冲突的条件是result[i] == result[n]
    12         //      3.同一斜线:假设第3层我们放到的是第3个位置,如果第1层与第3层皇后发生冲突
    13         //                  那么有result[0] = 0,result[2] = 2
    14         //                  所以同一斜线冲突的条件是Math.abs(n-i) == Math.abs(array[n] - array[i])
    15         for (int i = 0; i < n; i++) {
    16             if (result[i] == result[n] || Math.abs(n - i) == Math.abs(result[n] - result[i])) {
    17                 return false;
    18             }
    19         }
    20         return true;
    21     }

      第三步:实现放置皇后的代码。

     1     /**
     2      * Description:该方法用来放置皇后
     3      * @param n 表示第n个皇后,也就是第n行的皇后
     4      * @return
     5      */
     6     private void placeQueen(int n) {
     7         if(n == max) {
     8             showResult();
     9             return;
    10         }
    11         // 迭代从0-7,即每行都有8种可能性
    12         // 例如,第一行的皇后可以从第1列放置到第8列
    13         for(int i = 0; i < max; i++) {
    14             result[n] = i;
    15             // 当每放置一行的皇后,需要判断当前皇后是否会与之前的皇后们发生相互攻击的情况
    16             if(notAttackEachOther(n)) {
    17                 // 如果不会发生相互攻击的情况,那么继续放下一层皇后
    18                 placeQueen(n+1);
    19             }
    20         }
    21     }

      至此,代码编写完成,Git地址:https://github.com/HollowCup/algorithms-and-data-structure,具体实现位于algorithm工程下的queen目录,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你揭秘更多算法!

      

  • 相关阅读:
    mysql_db_sql_字段内容转化为小写
    Vue 单元测试 使用mocha+jest
    node express4 + 前端自动刷新
    vue-cli3 使用雪碧图
    稳赚的技术指标
    通信达日线买卖指标
    css+js调整当前界面背景音量
    canvas百分比加载动画
    处理安卓和ios当页面原生键盘弹出,输入框不显示
    js复制粘贴模板
  • 原文地址:https://www.cnblogs.com/maguanyue/p/11579216.html
Copyright © 2011-2022 走看看