ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【数据结构与算法(Java)】八皇后问题(回溯算法-递归)

2021-03-05 12:01:56  阅读:172  来源: 互联网

标签:Java chessArray queenNumber int 算法 放置 回溯 皇后 line


1. 递归思路

  1. 基本情况:放置到第8个皇后(即找到一个解法)
  2. 向基本情况靠近:若当前皇后的放置位置不冲突,则放置下一个皇后到下一行
  3. 调用自身:将当前皇后数加1后作为参数,继续放置

2. 代码实现

/**
 * 八皇后问题 - 回溯算法(递归)
 */
public class EightQueenProblem {
    /**
     * 一位数组表示棋盘
     * index - 行
     * data  - 列
     */
    private static int[] chessArray = new int[8];
    // 存放解法集合
    public static ArrayList<int[]> solutionList = new ArrayList<>();

    // 检查次数
    public static int checkCount;

    /**
     * 添加一种解法到list
     */
    private static void addSolution() {
        int[] newSolution = new int[8];
        for (int i = 0; i < 8; i++) {
            newSolution[i] = chessArray[i];
        }
        solutionList.add(newSolution);
    }

    /**
     * 检查是否可以放置
     *  1 同行不可放
     *  2 同列不可放: chessArray[line] == chessArray[line]
     *  3 同斜线不可放:
     *      行差 == 列差 <-> Math.abs(queenNumber - line) == Math.abs(chessArray[queenNumber] - chessArray[line])
     * @param queenNumber - 放置的第几个皇后
     * @return - true可放置,false不可
     */
    private static boolean canPut(int queenNumber) {
        checkCount++;
        for (int line = 0; line < queenNumber; line++) {
            if (chessArray[line] == chessArray[queenNumber]
                    || Math.abs(queenNumber - line) == Math.abs(chessArray[queenNumber] - chessArray[line])) {
                return false;
            }
        }
        return true;
    }

    /**
     *
     * @param queenNumber - 放置的第几个皇后
     */
    public static void putChessPieces(int queenNumber) {
        // 若放到第8个皇后:找到一个解法,添加到list,结束方法
        if (queenNumber == 8) {
            addSolution();
            return;
        }
        // 否则逐行放入皇后,判断是否可放置 (i 为列数)
        for (int i = 0; i < 8; i++) {
            // 将 第queenNumber个皇后 放到第 i 列
            chessArray[queenNumber] = i;
            // 若此时可以放置,则继续放置下一个皇后(递归)
            if (canPut(queenNumber)) {
                putChessPieces(queenNumber + 1);
            }
            // 若不可放,则继续遍历:即把皇后放到 第 i + 1列 继续判断
        }

    }
}

3. 结果

  • 共92种解法
  • 共判断是否可放置皇后15720次
  • 解法:
    0 4 7 5 2 6 1 3
    0 5 7 2 6 3 1 4
    0 6 3 5 7 1 4 2
    0 6 4 7 1 3 5 2
    1 3 5 7 2 0 6 4
    1 4 6 0 2 7 5 3
    1 4 6 3 0 7 5 2
    1 5 0 6 3 7 2 4
    1 5 7 2 0 3 6 4
    1 6 2 5 7 4 0 3
    1 6 4 7 0 3 5 2
    1 7 5 0 2 4 6 3
    2 0 6 4 7 1 3 5
    2 4 1 7 0 6 3 5
    2 4 1 7 5 3 6 0
    2 4 6 0 3 1 7 5
    2 4 7 3 0 6 1 5
    2 5 1 4 7 0 6 3
    2 5 1 6 0 3 7 4
    2 5 1 6 4 0 7 3
    2 5 3 0 7 4 6 1
    2 5 3 1 7 4 6 0
    2 5 7 0 3 6 4 1
    2 5 7 0 4 6 1 3
    2 5 7 1 3 0 6 4
    2 6 1 7 4 0 3 5
    2 6 1 7 5 3 0 4
    2 7 3 6 0 5 1 4
    3 0 4 7 1 6 2 5
    3 0 4 7 5 2 6 1
    3 1 4 7 5 0 2 6
    3 1 6 2 5 7 0 4
    3 1 6 2 5 7 4 0
    3 1 6 4 0 7 5 2
    3 1 7 4 6 0 2 5
    3 1 7 5 0 2 4 6
    3 5 0 4 1 7 2 6
    3 5 7 1 6 0 2 4
    3 5 7 2 0 6 4 1
    3 6 0 7 4 1 5 2
    3 6 2 7 1 4 0 5
    3 6 4 1 5 0 2 7
    3 6 4 2 0 5 7 1
    3 7 0 2 5 1 6 4
    3 7 0 4 6 1 5 2
    3 7 4 2 0 6 1 5
    4 0 3 5 7 1 6 2
    4 0 7 3 1 6 2 5
    4 0 7 5 2 6 1 3
    4 1 3 5 7 2 0 6
    4 1 3 6 2 7 5 0
    4 1 5 0 6 3 7 2
    4 1 7 0 3 6 2 5
    4 2 0 5 7 1 3 6
    4 2 0 6 1 7 5 3
    4 2 7 3 6 0 5 1
    4 6 0 2 7 5 3 1
    4 6 0 3 1 7 5 2
    4 6 1 3 7 0 2 5
    4 6 1 5 2 0 3 7
    4 6 1 5 2 0 7 3
    4 6 3 0 2 7 5 1
    4 7 3 0 2 5 1 6
    4 7 3 0 6 1 5 2
    5 0 4 1 7 2 6 3
    5 1 6 0 2 4 7 3
    5 1 6 0 3 7 4 2
    5 2 0 6 4 7 1 3
    5 2 0 7 3 1 6 4
    5 2 0 7 4 1 3 6
    5 2 4 6 0 3 1 7
    5 2 4 7 0 3 1 6
    5 2 6 1 3 7 0 4
    5 2 6 1 7 4 0 3
    5 2 6 3 0 7 1 4
    5 3 0 4 7 1 6 2
    5 3 1 7 4 6 0 2
    5 3 6 0 2 4 1 7
    5 3 6 0 7 1 4 2
    5 7 1 3 0 6 4 2
    6 0 2 7 5 3 1 4
    6 1 3 0 7 4 2 5
    6 1 5 2 0 3 7 4
    6 2 0 5 7 4 1 3
    6 2 7 1 4 0 5 3
    6 3 1 4 7 0 2 5
    6 3 1 7 5 0 2 4
    6 4 2 0 5 7 1 3
    7 1 3 0 6 4 2 5
    7 1 4 2 0 6 3 5
    7 2 0 5 1 4 6 3
    7 3 0 2 5 1 6 4

标签:Java,chessArray,queenNumber,int,算法,放置,回溯,皇后,line
来源: https://blog.csdn.net/hoyyoung/article/details/114387838

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有