java – 八皇后算法

我之前问过一个关于使用Java解决八个皇后问题的问题.
我有一个回溯算法来解决这个问题.

我尝试使用这个算法,但我不知道我的代码有什么问题.它最多只能放置7个皇后.

这是女王级:

    public class Queen {
    //Number of rows or columns
    public static final int BOARD_SIZE = 8;

    boolean[][] board;
    //Indicate an empty square
    public static final boolean EMPTY = false;
    //Indicate a square which containing a queen
    public static final boolean QUEEN = true;
    //Number of moves
    public static final int MOVES = 4;
    //Horizontal moves
    int[] horizontal;
    //Vertical moves
    int[] vertical;

    public int queens = 0;

    public Queen() {
        //Constructor creates an empty board
        board = new boolean[BOARD_SIZE][BOARD_SIZE];
        for (int row = 0; row < board.length; row++) {
            for (int col = 0; col < board[row].length; col++) {
                board[row][col] = EMPTY;
            }
        }

        horizontal = new int[MOVES];
        vertical = new int[MOVES];
        // up right
        horizontal[0] = -1;
        vertical[0] = 1; 
        // down left
        horizontal[1] = 1;
        vertical[1] = -1;
        // up left
        horizontal[2] = -1;
        vertical[2] = -1;
        // down right
        horizontal[3] = 1;
        vertical[3] = 1;
    }

    public boolean placeQueens (int column) {
        if (column > BOARD_SIZE) {
            return true;
        }
        else {
            boolean queenPlaced = false;
            int row = 1;

            while (!queenPlaced && row < BOARD_SIZE) {
                if (isUnderAttack(row,column)) {
                    ++row;
                }// end if
                else{
                    setQueen(row,column);
                    queenPlaced = placeQueens(column + 1);
                    if (!queenPlaced) {
                        removeQueen(row,column);
                        ++row;
                    }// end if
                }// end else
            }// end while
            return queenPlaced;
        }// end else
    }

    private void removeQueen(int row,int column) {
        board[row][column] = EMPTY;
        System.out.printf("queen REMOVED from [%d][%d]\n",row,column);
    --queens;
    }

    private void setQueen(int row,int column) {
        board[row][column] = QUEEN;
        System.out.printf("queen PLACED in [%d][%d]\n",column);
        ++queens;
    }

    public boolean isUnderAttack(int row,int col) {
        boolean condition = false;
        // check row
        for (int column = 0; column < BOARD_SIZE; column++) {
            if ((board[row][column] == true)) {
                condition = true;
            }
        }

        // check column
        for (int row_ = 0; row_ < board.length; row_++) {
            if (board[row_][col] == true) {
                        condition = true;
            }
        }

        // check diagonal
        for (int row_ = row,col_ = col; row_ >= 0 && col_ < 8; row_ += horizontal[0],col_ += vertical[0]) {
            if (board[row_][col_] == true) {
                condition = true;
            }
        }
        for (int row_ = row,col_ = col; row_ < 8 && col_ >= 0; row_ += horizontal[1],col_ += vertical[1]) {
            if (board[row_][col_] == true) {
                condition = true;
            }
        }
        for (int row_ = row,col_ = col; row_ >= 0 && col_ >= 0; row_ += horizontal[2],col_ += vertical[2]) {
            if (board[row_][col_] == true) {
                condition = true;
            }
        }
        for (int row_ = row,col_ = col; row_ < 8 && col_ < 8; row_ += horizontal[3],col_ += vertical[3]) {
            if (board[row_][col_] == true) {
                condition = true;
            }
        }

        return condition;
    }

    public void displayBoard () {
        int counter = 0;
        for (int row = 0; row < board.length; row++) {
            for (int col = 0; col < board[row].length; col++) {
                if (board[row][col] == true) {
                    System.out.printf("|%s|","x");
                    counter++;
                }
                else {              
                    System.out.printf("|%s|","o");
                }
            }
            System.out.println();
        }

        System.out.printf("%d queens has been placed\n",counter);
    }
}
最佳答案
在Java数组中是0-indexed,意味着第一个项目在索引0处.您似乎还没有完全掌握这个关键事实,这导致您编写了许多off-by-one errors的代码.

一个问题在这里:

int row = 1;

它应该是:

int row = 0;

第二个问题在这里:

if (column > BOARD_SIZE) {
    return true;
}

它应该是这样的:

if (column >= BOARD_SIZE) {
    return true;
}

您尚未发布其余代码,但我愿意打赌,当您调用placeQueens方法时,代码中会出现第三个错误.如果我知道你是什么样的人,那么你可能会这样做:

queen.placeQueens(1);

但它应该是这样的:

queen.placeQueens(0);

通过所有这些更改,它可以按预期工作.最终结果是:

|x||o||o||o||o||o||o||o|
|o||o||o||o||o||o||x||o|
|o||o||o||o||x||o||o||o|
|o||o||o||o||o||o||o||x|
|o||x||o||o||o||o||o||o|
|o||o||o||x||o||o||o||o|
|o||o||o||o||o||x||o||o|
|o||o||x||o||o||o||o||o|
8 queens has been placed

看到它在线工作:ideone

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


eclipse如何打jar包
eclipse如何查看源码
如何评价java框架的质量?
Spring MVC 和 Spring Security 有何区别?
eclipse如何运行java代码
eclipse的jdk如何配置
eclipse如何部署web项目
如何使用eclipse编程
eclipse如何导入svn项目
eclipse如何打开项目
eclipse如何添加svn
java中用于日志记录的框架有哪些?
eclipse如何更改jdk
如何在eclipse中配置svn
eclipse如何添加sdk
java框架中如何实现高并发?
eclipse如何配置python
java框架有哪些用于人工智能和机器学习的类型?
eclipse如何配置git
eclipse如何添加jdk