如何纠正我的 Java 异常溢出:索引 3,共 3 个越界

How to rectify my Java exception overflow: index 3 of 3 out of bounds

我运行陷入溢出异常。这是家庭作业;我不是在寻找直接的答案,因为那不会帮助我学习。这个作业是给我的人工智能 class。我们正在使用最佳优先算法和 A* 算法解决 n 拼图问题。

我有一个代表我的游戏板的二维数组。总共有 8 个方块,其中 1 个空白 space。那些不熟悉 n-puzzle 的人。关键是通过移动空白瓷砖并移动其他 8 块来从瓷砖的起始配置到目标配置。到目前为止,在这个作业中,我正在实现空白块的移动,将空白块与上、左、右或最近的下图块交换。我也有显示板的功能。我也实现了所有定向运动。

我尝试声明一个临时二维数组并使用内置函数 Arrays.copyOf(board, board.length)。编译时抱怨传递了一个二维数组。我只是不确定我的支票是如何越界的。此外,如果数组已更新,则 'b' 将在 (i= 0, j = 1) 处找到,将 1 添加到 j 会使我位于数组的边缘。这让我相信我需要在进行更多更改之前复制我的二维数组。如果数组实际上没有更新 'b' 会在我的边缘,然后我尝试将它移出边界。这对我来说很有意义,但它显示数组在我的输出中进行了更改。

我知道这是一个低级问题。我只是不知道如何在 Java 中复制数组,谢谢。我现在的参考是“思考 Java 第 4 版”。布鲁斯·埃克尔

下面你会发现我的主要代码执行流程,我实现的 moveBlankLeft/Right 函数,以及 运行 代码产生的溢出异常。

       public static void main(String[] args)
        {
          bestFirst game = new bestFirst( );
          game.displayBoard( );
          game.moveBlankLeft(game.moves, game.defheight, game.defwidth);
          game.displayBoard( );
          game.moveBlankRight(game.moves, game.defwidth, game.defheight);
          game.displayBoard( );
        }
    int moveBlankLeft(int moves, int defwidth, int defheight)
    {
        moves = moves + 1;
        for(int i = 0; i < defheight; i++) 
        {
            for(int j = 0; j < defwidth; j++)
            {
                if((i < defheight && j < defwidth && i >= 0 && j >= 
                0)&&board[i][j]=='b')
                {
                    char temp = board[i][j - 1]; 
                    board[i][j] = temp;
                    board[i][j - 1] = 'b';
                }
            }
         }
          System.out.println(" Total moves in solving: " +moves);
          return 0;
    }
    int moveBlankRight(int moves, int defwidth, int defheight)
    {
        moves = moves + 1;
        for(int i = 0; i < defheight; i++) 
        {
            for(int j = 0; j < defwidth; j++)
            {
                if((i < defheight && j < defwidth && i >= 0 && j >= 
                0)&&board[i][j]=='b')
                {
                      char temp = board[i][j + 1]; <-- culprit line...
                      board[i][j] = temp;
                      board[i][j + 1] = 'b';
                }
             }
         }
         System.out.println(" Total moves in solving: " +moves);
         return 0;
     }
Welcome to the best-first n-puzzle challenge solver.
4 5 b
6 1 8        = initial board
7 3 2
 Total moves in solving: 1
4 b 5
6 1 8        = board after shiftBlankLeft(...)
7 3 2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
        at bestFirst.moveBlankRight(best-first.java:83)
        at bestFirst.main(best-first.java:161)

moveBlankRight 方法中,您应该将您的实现替换为:

if(j== defwidth-1){
    char temp= bord[i+1][0];
    board[i+1][0]='b';
    board[i][j]=temp;
}
else{
    char temp = board[i][j + 1]; 
    board[i][j] = temp;
    board[i][j + 1] = 'b';
}

这样输出将是:

Welcome to the best-first n-puzzle challenge solver.
4 5 b
6 1 8        = initial board
7 3 2
 // move right of b
4 5 6
b 1 8        = board after shiftBlankRight
7 3 2

你还应该加上条件 if(i==defheight-1)