8皇后問題

我們有一個 8x8 的棋盤,希望往裏放 8 個棋子(皇后),每個棋子所在的行、列、對角線都不能有另一個棋子 

package com.example.demo;

public class _8Queens {


    int[] result = new int[8];//全局或成員變量,下標表示行,值表示queen存儲在哪一列
    public void cal8queens(int row) { // 調用方式:cal8queens(0);
        if (row == 8) { // 8個棋子都放置好了,打印結果
            printQueens(result);
            return; // 8行棋子都放好了,已經沒法再往下遞歸了,所以就return
        }
        for (int column = 0; column < 8; ++column) { // 每一行都有8中放法,並且每一種放法都會打印
            if (isOk(row, column)) { // 有些放法不滿足要求
                result[row] = column; // 第row行的棋子放到了column列
                cal8queens(row+1); // 考察下一行
            }
        }
    }

    private boolean isOk(int row, int column) {//判斷row行column列放置是否合適
        int leftup = column - 1, rightup = column + 1;
        for (int i = row-1; i >= 0; --i) { // 逐行往上考察每一行
            if (result[i] == column) return false; // 第i行的column列有棋子嗎?
            if (leftup >= 0) { // 考察左上對角線:第i行leftup列有棋子嗎?
                if (result[i] == leftup) return false;
            }
            if (rightup < 8) { // 考察右上對角線:第i行rightup列有棋子嗎?
                if (result[i] == rightup) return false;
            }
            --leftup; ++rightup;
        }
        return true;
    }

    private void printQueens(int[] result) { // 打印出一個二維矩陣
        for (int row = 0; row < 8; ++row) {
            for (int column = 0; column < 8; ++column) {
                if (result[row] == column) System.out.print("Q ");
                else System.out.print("* ");
            }
            System.out.println();
        }
        System.out.println();
    }

    public static void main(String[] args) {
        new _8Queens().cal8queens(0);

    }

}


以下是打印結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章