zoukankan      html  css  js  c++  java
  • 八皇后问题(回溯法求解)

    问题描述

    在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线(包括反斜线)上,问有多少种摆法。

    解题思路

    八皇后问题,是回溯算法的典型案例,可以使用回溯法解决该题。

    第一个皇后先放第一行第一列,然后第二个皇后放在与第一个皇后不冲突的列,继续第三个皇后,……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解。然后回头继续第一个皇后放第二列,后面继续循环……

    代码实现

        private static int max;       // 皇后的个数
        private static int[] cols;    // 记录已放置皇后所在的列数
    
        // 判断将要放置的皇后与已放置的是否冲突
        private static boolean judge(int n) {
            for (int i=0; i<n; i++)
                // 是否与皇后i处于同一列或同一斜线上
                if (cols[i]==cols[n] || Math.abs(cols[i]-cols[n])==Math.abs(n-i))
                    return false;
            return true;
        }
    
        private static int count = 0;     // count种不同的摆法
    
        private static void test(int n) {
            // max个皇后已经放置完成,得到一种摆法,count加一
            if (n == max) {
                count++;
                return;
            }
            for (int i=0; i<max; i++) {
                cols[n] = i;
                if (judge(n)) test(n+1);   // 皇后n满足要求,放置下一个皇后
            }
        }
    
        public static int eightQueen(int queenNums) {
            max = queenNums;
            cols = new int[max];
            test(0);
            return count;
        }

    测试结果如下:

        public static void main(String[] args) {
            System.out.println(eightQueen(8));    // 92
        }

    mark

  • 相关阅读:
    写excel文件-xlsxwriter包的使用
    python代码规范
    mac系统的插件
    bash字符串处理
    ssh到ubuntu没颜色
    linux mysql 端口号修改
    Centos7 编译安装 PHP7.1,以及msgpack扩展
    Xmanager4注册码
    Python 的 pyinotify 模块 监控文件夹和文件的变动
    Python的50个模块,满足你各种需要
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9596543.html
Copyright © 2011-2022 走看看