【问题标题】:8 Queens Not Using the Backtracking Method8 皇后不使用回溯法
【发布时间】:2013-12-27 12:22:45
【问题描述】:

我正在做 8 个皇后问题的一个版本,但没有使用回溯法。对于其中一种方法,我必须“对正方形进行评分”,基本上我需要找出如果要在盒子中放置女王,则将变得不可用的单元格数量。我的问题是我无法让我的代码返回正方形的分数。我的 for 循环有什么问题吗?

import java.util.ArrayList;

    public class Chessboard {
private int[][] board;
public static final int QUEEN = -2;
public static final int SQUIGGLE = -1;

/**
 * constructor initializes board to be of size n-by-n and containing all
 * zeros
 */
public Chessboard(int n) {
    board = new int[n][n];

}

/**
 * returns the board
 */
public int[][] getBoard() {
    return board;

}
/**
 * returns SQUIGGLE if square at row, col contains SQUIGGLE returns QUEEN if
 * square at row, col contains QUEEN otherwise, counts the number of squares
 * that would become unavailable if the square at row, col were to receive a
 * queen; this count is returned
 */
public int scoreSquare(int row, int col) {

    if (board[row][col] == -1) {
        return SQUIGGLE;
    } else if (board[row][col] == -2) {
        return QUEEN;
    }

    else {
        int countsquare = 1;
        for (int r = 0; r < board[col].length; r++) {
            countsquare++;
        }
        for (int c = 0; c < board[row].length; c++) {
            countsquare++;
        }

        for (int r = row + 1, c = col + 1; r < board.length
                && c < board.length; r++, c++) {
            countsquare++;
        }
        for (int r = row + 1, c = col - 1; r < board.length && c < 0; r++, c--) {
            countsquare++;
        }
        for (int r = row - 1, c = col + 1; r < 0 && c < board.length; r--, c++) {
            countsquare++;
        }
        for (int r = row - 1, c = col - 1; r < 0 && c < 0; r--, c--) {
            countsquare++;
        }
        return countsquare;
    }

}

【问题讨论】:

    标签: java n-queens


    【解决方案1】:

    在将rc 与零进行比较的每个循环中,您需要使用&gt;= 而不是&lt;。例如,在这个循环中,您需要使用 c &gt;= 0 而不是 c &lt; 0

    for (int r = row + 1, c = col - 1; r < board.length && c < 0; r++, c--) {
    

    这是因为您将 向下计数 到零,因此您希望在计数器高于零时继续计数。

    最后,虽然它不应该影响您的结果,但您实际上并不需要前两个循环,因为它们中的每一个都应该只添加n(即board.length,即任何行的大小或列)。

    【讨论】:

      猜你喜欢
      • 2017-04-23
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多