解决 N 个皇后时的数组索引超出范围异常

Posted

技术标签:

【中文标题】解决 N 个皇后时的数组索引超出范围异常【英文标题】:Array Index Out of Bounds Exception while solving N Queens 【发布时间】:2016-12-07 19:37:41 【问题描述】:

我正在编写使用递归回溯来解决 8 个皇后问题的代码(将 n 个国际象棋皇后放在 n × n 棋盘上,这样所有皇后都不会互相攻击)。

我的任务是创建两个方法: 写一个公共的solveQueens(int n)方法来解决nxn板的问题

编写一个私有递归placeQueen(board, column) 方法来尝试在指定列中放置一个皇后。

到目前为止,我已经在我的程序中写了这个:

public class Queen 

    public static boolean isLegal(int[] board, int n) 
        for (int i = 0; i < n; i++) 
            if (board[i] == board[n]) 
                return false;
            
            if ((board[i] - board[n]) == (n - i)) 
                return false;
            
            if ((board[n] - board[i]) == (n - i)) 
                return false;
            
        
        return true;

    

    public static void solver(int n) 
        int[] board = new int[n];
        PlaceQueen(board, 0);
    

    private static int[] PlaceQueen(int[] board, int column) 
        int n = board.length;
        if (column == n); else 
            for (int row = 0; row < n; row++) 
                board[column] = row;
                if (isLegal(board, column)) 
                    PlaceQueen(board, column + 1);
                

            
        
        return (board);
    

    public static void main(String[] args) 
        int n = Integer.parseInt(args[0]);
        solver(n);
    

我的程序成功编译,但每当我尝试运行它时,我都会收到此错误。

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 0 在 Queen.main(Queen.java:39)

关于我应该在哪里编辑代码以消除此异常的反馈有什么建议吗?

【问题讨论】:

你如何运行你的程序?好像你没有传递任何程序参数。 【参考方案1】:

您是否为程序提供参数? 它期望有一个integer 参数。

public static void main(String[] args) 
       int n = Integer.parseInt(args[0]);
       solver(n);           
    

如果您尝试访问不在args 数组范围内的索引,它会上升java.lang.ArrayIndexOutOfBoundsException

【讨论】:

是否有其他方法可以推荐使用 main 方法进行测试? 你如何运行你的课程?如果您在命令行中运行,如果您想在程序启动时使用8 值来评估您的板阵列,您可以执行java Queen 8。如果您的电路板应该始终具有8 的大小,则在创建电路板时不应使用参数,而应在实例化电路板时使用常量。

以上是关于解决 N 个皇后时的数组索引超出范围异常的主要内容,如果未能解决你的问题,请参考以下文章

滚动时将新项目添加到列表时出现数组索引超出范围异常

获取“索引超出数组范围”异常

从数组中删除重复项时出现超出范围异常

为啥 List<T> 的“索引超出范围”异常,但数组却没有?

创建任务时列出索引超出范围异常

将类添加到列表 C# 时,索引超出了数组的范围