Java算法-八皇后问题

       本文旨在在于记录一个百度上看来的算法,算法让我吃惊的地方在于将数组下标的功能发挥的淋漓尽致。八皇后问题常规算法矩阵维护法、递归法、迭代法、手动堆栈法四种。但是本质都是在描述同一行、同一列或同一斜线上(右上到左下,左上到右下)四种关系。在百度上看到的一种算法private int[] rup = new int[(2*8)+1]; //右上至左下是否有皇后和private int[] lup = new int[(2*8)+1]; //左上至右下是否有皇后仅用两个一维数组就完美的展现出了这种关系。看过后只能感叹自己以前学习不够努力了啊。

具体算法:

public class Queen {
    private int[] column; //同栏是否有皇后,1表示有
    private int[] rup; //右上至左下是否有皇后
    private int[] lup; //左上至右下是否有皇后
    private int[] queen; //解答
    private int num; //解答编号
 
    public Queen() {
        column = new int[8+1];
        rup = new int[(2*8)+1];
        lup = new int[(2*8)+1];
        for (int i = 1; i <= 8; i++)
            column[i] = 0;
        for (int i = 1; i <= (2*8); i++)
            rup[i] = lup[i] = 0;  //初始定义全部无皇后
        queen = new int[8+1];
    }
 
    public void backtrack(int i) {
        if (i > 8) {
            showAnswer();
        } else {
            for (int j = 1; j <= 8; j++) {
                if ((column[j] == 0) && (rup[i+j] == 0) && (lup[i-j+8] == 0)) {
                    //若无皇后
                    queen[i] = j; //设定为占用
                    column[j] = rup[i+j] = lup[i-j+8] = 1;
                    backtrack(i+1);  //循环调用
                    column[j] = rup[i+j] = lup[i-j+8] = 0;
                }
            }
        }
    }
 
    protected void showAnswer() {
        num++;
        System.out.println("\n解答" + num);
        for (int y = 1; y <= 8; y++) {
            for (int x = 1; x <= 8; x++) {
                if(queen[y]==x) {
                    System.out.print("Q");
                } else {
                    System.out.print(".");
                }
            }
            System.out.println();
        }
    }
 
    public static void main(String[] args) {
        Queen queen = new Queen();
        queen.backtrack(1);
    }
}

总结:算法是常规的回溯,主要是一维数组表示斜线关系,很是巧妙。

    

你可能感兴趣的:(Java算法)