回溯算法

1、八皇后问题
我们有一个 8x8 的棋盘,希望往里放 8 个棋子(皇后),每个棋子所在的行、列、对角线
都不能有另一个棋子。你可以看我画的图,第一幅图是满足条件的一种方法,第二幅图是不
满足条件的。八皇后问题就是期望找到所有满足这种要求的放棋子方式。

2、解答

/**
 * 回溯算法-八皇后问题
 */
public class NQueen {

    int[] res = new int[4];

    public static void main(String[] args) {
        new NQueen().cal8Queens(0);
    }

    public void cal8Queens(int row) {
        if (row == 4) {
            printRes(res);
            return;
        }

        for (int col = 0; col < 4; col++) {
            if (isOk(row, col)) {
                res[row] = col;
                cal8Queens(row  +1);
            }
        }

    }

    private void printRes(int[] res) {
        for (int row = 0; row < 4; row++) {
            for (int col = 0; col < 4; col++) {
                if (res[row] == col) {
                    System.out.print("Q");
                } else {
                    System.out.print("*");
                }
            }
            System.out.println();
        }
        System.out.println();

    }

    private boolean isOk(int row, int col) {
        //左上角
        int leftUp = col - 1;
        // 右上角
        int rightUp = col + 1;
        for (int i = row - 1; i >= 0; i--) {
            // 当前点上有,返回false
            if (res[i] == col) {
                return false;
            }
            // 左上角或右上角有
            if (leftUp >= 0) {
                if (res[i] == leftUp) {
                    return false;
                }
            }
            if (rightUp < 4) {
                if (res[i] == rightUp) {
                    return false;
                }
            }

            leftUp--;
            rightUp++;
        }

        return true;
    }

}
原文地址:https://www.cnblogs.com/noaman/p/14433836.html