簡體   English   中英

八皇后區Java異常錯誤

[英]Eight Queens Java exception error

我試圖制作一個程序來解決八個皇后區問題,但是每次運行代碼時,我都會遇到異常錯誤。 我在做什么方面有些困惑。 任何方向的幫助將不勝感激。

Queens.mainQueens(Queens.java:78)的Queens.isUnderAttack(Queens.java:132)處的線程“ main”中的java.lang.ArrayIndexOutOfBoundsException:-1異常Queens.main(Queens.java:155)處的Queens.placeQueens(Queens.java:78)

public class Queens
{
    //squares per row or column
    public static final int BOARD_SIZE = 8;

    //used to indicate an empty square 
    public static final int EMPTY = 0;

    //used to indicate square contains a queen
    public static final int QUEEN = 1;

    private int board[][]; //chess board

    public Queens()
    {
        //constructor: Creates an empty square board.
        board = new int[BOARD_SIZE][BOARD_SIZE];

    }


    //clears the board
    //Precondition: None
    //Postcondition: Sets all squares to EMPTY
    public void clearBoard()
    {
        //loops through the rows
        for(int row = 0; row < BOARD_SIZE; row++)
        {
            //loops through the columns
            for (int column = 0; column < BOARD_SIZE; column++)
            {
                board[row][column] = EMPTY;
            }
        }   
    }


    //Displays the board 
    //precondition: None
    //postcondition: Board is written to standard output; 
    //zero is an EMPTY square, one is a square containing a queen (QUEEN).
    public void displayBoard()
    {
        for (int row = 0; row < BOARD_SIZE; row++)
        {
            System.out.println("");

            for (int column = 0; column < BOARD_SIZE; column++)
            {
                System.out.print(board[row][column] + " ");
            }
        }
    }



    //Places queens in columns of the board beginning at the column specified.
    //Precondition: Queens are placed correctly in columns 1 through column-1.
    //Postcondition: If a solution is found, each column of the board contains one queen and
    //method returns true; otherwise, returns false (no solution exists for a queen anywhere in column specified).
    public boolean placeQueens(int column)
    {
        if(column >= BOARD_SIZE)
        {
            return true; //base case
        }
        else
        {
            boolean queenPlaced = false;
            int row = 1; // number of square in column

            while( !queenPlaced && (row < BOARD_SIZE))
            {
                //if square can be attacked
                **if (!isUnderAttack(row, column))**
                {
                    setQueen(row, column); //consider next square in column
                    queenPlaced = placeQueens(column+1);
                    //if no queen is possible in next column,
                    if(!queenPlaced)
                    {
                        //backtrack: remover queen placed earlier
                        //and try next square in column
                        removeQueen(row, column);
                        //++row;
                    }
                }
                row++;
            }
            return queenPlaced;
        }

    }



    //Sets a queen at square indicated by row and column
    //Precondition: None
    //Postcondition: Sets the square on the board in a given row and column to Queen.
    private void setQueen(int row, int column)
    {
        board[row][column] = QUEEN; 
    }



    //removes a queen at square indicated by row and column
    //Precondition: None
    //Postcondition: Sets the square on the board in a given row and column to EMPTY.
    private void removeQueen(int row, int column)
    {
        board[row][column] = EMPTY;
    }


    //Determines whether the square on the board at a given row and column is
    //under attack by any queens in the columns 1 through column-1.
    //Precondition: Each column between 1 and column-1 has a queen paced in a square at
    //a specific row. None of these queens can be attacked by any other queen.
    //Postcondition: If the designated square is under attack, returns true: otherwise return false.
    private boolean isUnderAttack(int row, int column)
    {


            for (int y=0; y<BOARD_SIZE; y++)
            {
                if (board[row][y] == QUEEN ||    // possible horizontal attack
                        board[row-column+y][y] == QUEEN ||   // diagonal NW
                        **board[row+column-y][y] == QUEEN)     // diagonal SW**
                        return true;
            }

        return false;
    }



    private int index(int number)
    {
        //Returns the array index that corresponds to a row or column number.
        //Precondition: 1 <= number <= BOARD_SIZE.
        //Postcondition: Returns adjusted index value

        return number -1 ;
    }


    //main to test program
    public static void main(String[] args)
    {
        Queens Q = new Queens();
        **if(Q.placeQueens(0))**
        {
            System.out.println(Q);
        }
        else
        {
            System.out.println("Not Possible");
        }
    }


}

在“ isUnderAttack()”循環中,這不好:

board[row-column+y][y]
board[row+column-y][y]

當'y'從'0'變為'board size'時,這將意味着索引超出了數組的邊界(除非行和列都為0)-錯誤消息已明確說明。

應該使用適當的索引或通過添加條件以檢查索引是否在范圍內來糾正循環:

int rowIndex = row-column+y;
if(rowIndex>=0 && rowIndex<BOARD_SIZE) {
      if(board[row-column+y][y] == QUEEN) {
            return true;
      }
}

當然,其他對角線也一樣

該死的,即使使用qwerty,在Android手機上鍵入代碼也很慢...

private boolean isUnderAttack(int row, int column)
{
    for (int y = 0; y < BOARD_SIZE; y++)
    {
        if (board[row][y] == QUEEN)
            return true; // possible horizontal attack

        int x1 = row - column + y;
        if (0 <= x1 && x1 < BOARD_SIZE && board[x1][y] == QUEEN)
            return true; // diagonal NW

        int x2 = row + column - y;
        if (0 <= x2 && x2 < BOARD_SIZE && board[x2][y] == QUEEN)
            return true; // diagonal SW
    }

    return false;
}

這兩個值都低於零

row-column+y
row+column-y

導致錯誤的情況之一考慮這種情況,board [row + column-y] [y] == QUEEN假設row = 1,column = 0且y為4,索引變為-ve導致錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM