首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迷宫递归代码完成迷宫但返回错误

迷宫递归代码完成迷宫但返回错误
EN

Stack Overflow用户
提问于 2019-02-18 03:44:08
回答 1查看 102关注 0票数 1

我希望在我的代码中有任何帮助来找出错误。

我正在为我的Java类做一个递归迷宫项目,并且已经完全陷入困境。迷宫完成并显示成功的步骤,但在结束时会返回大量错误。

该算法在mazeTraversal函数下实现。

谢谢。

代码语言:javascript
复制
public class Maze {
   static final int DOWN = 0;
   static final int RIGHT = 1;
   static final int UP = 2;
   static final int LEFT = 3;
   static final int ROW_START = 2;
   static final int COLUMN_START = 0;
   static int move = 0;
   static char maze[][] =
      { { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
        { '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.', '#' },
        { '.', '.', '#', '.', '#', '.', '#', '#', '#', '#', '.', '#' },
        { '#', '#', '#', '.', '#', '.', '.', '.', '.', '#', '.', '#' },
        { '#', '.', '.', '.', '.', '#', '#', '#', '.', '#', '.', '.' },
        { '#', '#', '#', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
        { '#', '.', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
        { '#', '#', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
        { '#', '.', '.', '.', '.', '.', '.', '.', '.', '#', '.', '#' },
        { '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '.', '#' },
        { '#', '.', '.', '.', '.', '.', '.', '#', '.', '.', '.', '#' },
        { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' } };


   // method calls mazeTraversal with correct starting point and direction
   public void traverse() {
      boolean result = mazeTraversal( ROW_START, COLUMN_START );

      if ( !result )
         System.out.println( "Maze has no solution." );
   } // end method traverse

   // traverse maze recursively
   public boolean mazeTraversal( int row, int column ) {
       // TO BE COMPLETE
                maze[row][column] = 'x';
                printMaze();
                if (column > 0 && maze[row][column - 1] == '.')
                {
                    maze[row][column - 1] = 'x';
                    return mazeTraversal(row, column - 1);
                }
                else if (column <= 11 && maze[row][column + 1] == '.')
                {
                    maze[row][column + 1] = 'x';
                    return mazeTraversal(row, column + 1);
                }
                else if (row > 0 && maze[row - 1][column] == '.')
                {
                    maze[row - 1][column] = 'x';
                    return mazeTraversal(row - 1, column);
                }
                else if (row <= 11 && maze[row + 1][column] == '.')
                {
                    maze[row + 1][column] = 'x';
                    return mazeTraversal(row + 1, column);
                }
                else
                {
                    maze[row][column] = 'o';
                    if (column <= 11 && maze[row][column + 1]  == 'x')
                    {
                        maze[row][column + 1] = 'o';
                        return mazeTraversal(row, column + 1);
                    }
                    else if (column > 0 && maze[row][column - 1] == 'x')
                    {
                        maze[row][column - 1] = 'o';
                        return mazeTraversal(row, column - 1);
                    }
                    else if (row <= 11 && maze[row + 1][column] == 'x')
                    {
                        maze[row + 1][column] = 'o';
                        return mazeTraversal(row + 1, column);
                    }
                    else if (row > 0 && maze[row - 1][column] == 'x')
                    {
                        maze[row - 1][column] = 'o';
                        return mazeTraversal(row - 1, column);
                    }
                }           
               return true;
   } // end method mazeTraversal

   // draw maze
   public void printMaze() {

      // for each space in maze
      for ( int row = 0; row < maze.length; row++ )
      {
         for ( int column = 0; column < maze[ row ].length;
            column++ )
         {
            if ( maze[ row ][ column ] == '0' )
               System.out.print( " ." );
            else
               System.out.print( " " + maze[ row ][ column ] );
         }

         System.out.println();
      } // end for

      System.out.println();
   } // end method printMaze
} // end class Maze

以下是错误:

代码语言:javascript
复制
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12

    at Maze.mazeTraversal(Maze.java:61)
    at Maze.mazeTraversal(Maze.java:61)
    at Maze.mazeTraversal(Maze.java:61)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.mazeTraversal(Maze.java:51)
 # . . . . . . # . . . #
    at Maze.mazeTraversal(Maze.java:56)
    at Maze.mazeTraversal(Maze.java:56)
    at Maze.mazeTraversal(Maze.java:46)
    at Maze.mazeTraversal(Maze.java:46)
 # # # # # # # # # # # #

    at Maze.mazeTraversal(Maze.java:46)
    at Maze.mazeTraversal(Maze.java:56)
    at Maze.mazeTraversal(Maze.java:56)
    at Maze.mazeTraversal(Maze.java:56)
    at Maze.mazeTraversal(Maze.java:56)
    at Maze.mazeTraversal(Maze.java:56)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.mazeTraversal(Maze.java:69)
    at Maze.mazeTraversal(Maze.java:69)
    at Maze.mazeTraversal(Maze.java:79)
    at Maze.mazeTraversal(Maze.java:79)
    at Maze.mazeTraversal(Maze.java:69)
    at Maze.mazeTraversal(Maze.java:46)
    at Maze.mazeTraversal(Maze.java:56)
    at Maze.mazeTraversal(Maze.java:56)
    at Maze.mazeTraversal(Maze.java:69)
    at Maze.mazeTraversal(Maze.java:46)
    at Maze.mazeTraversal(Maze.java:46)
    at Maze.mazeTraversal(Maze.java:46)
    at Maze.mazeTraversal(Maze.java:61)
    at Maze.mazeTraversal(Maze.java:61)
    at Maze.mazeTraversal(Maze.java:61)
    at Maze.mazeTraversal(Maze.java:61)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.mazeTraversal(Maze.java:69)
    at Maze.mazeTraversal(Maze.java:69)
    at Maze.mazeTraversal(Maze.java:46)
    at Maze.mazeTraversal(Maze.java:46)
    at Maze.mazeTraversal(Maze.java:61)
    at Maze.mazeTraversal(Maze.java:61)
    at Maze.mazeTraversal(Maze.java:61)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.mazeTraversal(Maze.java:56)
    at Maze.mazeTraversal(Maze.java:51)
    at Maze.traverse(Maze.java:31)
    at MazeTest.main(MazeTest.java:9)
/Users/user/Library/Caches/NetBeans/8.2/executor-snippets/run.xml:53: Java returned: 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-18 05:40:38

下面的<= (小于或等于)运算符都是不正确的,它们应该只是< (小于):

代码语言:javascript
复制
else if (column <= 11 && maze[row][column + 1] == '.')
else if (row <= 11 && maze[row + 1][column] == '.')
    if (column <= 11 && maze[row][column + 1]  == 'x')
    else if (row <= 11 && maze[row + 1][column] == 'x')

此外,您还需要添加迷宫测试的显式结束(即检查ROW_ENDCOLUMN_END),否则上述更改将导致您的代码探索并回溯整个迷宫:

代码语言:javascript
复制
static final int ROW_END = 4;
static final int COLUMN_END = 11;

// ...

// traverse maze recursively
public boolean mazeTraversal(int row, int column)
{
    maze[row][column] = 'x';
    printMaze();

    if (column == COLUMN_END && row == ROW_END)
    {
        return true;
    }

    if (column > 0 && maze[row][column - 1] == '.')
    {
        maze[row][column - 1] = 'x';
        return mazeTraversal(row, column - 1);
    }

    if (column < 11 && maze[row][column + 1] == '.')
    {
        maze[row][column + 1] = 'x';
        return mazeTraversal(row, column + 1);
    }

    if (row > 0 && maze[row - 1][column] == '.')
    {
        maze[row - 1][column] = 'x';
        return mazeTraversal(row - 1, column);
    }

    if (row < 11 && maze[row + 1][column] == '.')
    {
        maze[row + 1][column] = 'x';
        return mazeTraversal(row + 1, column);
    }

    maze[row][column] = 'o';

    if (column < 11 && maze[row][column + 1] == 'x')
    {
        maze[row][column + 1] = 'o';
        return mazeTraversal(row, column + 1);
    }

    if (column > 0 && maze[row][column - 1] == 'x')
    {
        maze[row][column - 1] = 'o';
        return mazeTraversal(row, column - 1);
    }

    if (row < 11 && maze[row + 1][column] == 'x')
    {
        maze[row + 1][column] = 'o';
        return mazeTraversal(row + 1, column);
    }

    if (row > 0 && maze[row - 1][column] == 'x')
    {
        maze[row - 1][column] = 'o';
        return mazeTraversal(row - 1, column);
    }

    return true;
} // end method mazeTraversal
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54740187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档