八皇后问题(回溯法求解)

问题描述

在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

原文地址:https://www.cnblogs.com/deltadeblog/p/9596543.html