java - 如何找到所有可用的迷宫路径?

标签 java recursion maze

我正在尝试编写一个程序,该程序被赋予一个迷宫并试图找到出路。 M是入口,E是导出,1是墙壁,0是路径。它应该找到每条路径并将P放入该路径中。它应该找到所有可用的路径。现在它找到了路径的一部分。

这是代码:

public class Maze 
{
    private int size;
    private String[][] board;
    private int total; //# of boards
    private int eX;
    private int eY;
    private int mX;
    private int mY;

    public Maze( int size, String[][] board )
    {
        this.size = size;
        this.board = board;
        total = 0;

    }

    private void find( String c )
    {
        int x=0, y=0;
        for( int i = 0; i < size; i++ )
        {
            for( int j = 0; j < size; j++ )
            {
                if( board[i][j].equals(c) )
                {
                    x = i;
                    y = j;
                }
            }
        }
        if( c.equals("M") )
        {
            mX = x;
            mY = y;
        }
        else if( c.equals("E") )
        {
            eX = x;
            eY = y;
        }
    }

    public void findPath(  )
    {
        find( "M" );
        find( "E" );
        findNext( mX, mY );
    }

    public void findNext( int x, int y )
    { 
        String last = board[x][y];
            if( board[x][y].equals("P") ) board[x][y] = "1";
        board[x][y] = "P";

        if( rightAvailability(x,y) )
        {
            findNext(x+1, y);
        }
        else if( leftAvailability(x,y) )
        {
            findNext(x-1, y);
        }
        else if( aboveAvailability(x,y) )
        {
            findNext(x, y+1);
        }
        else if( belowAvailability(x,y) )
        {
            findNext(x, y-1);
        }
        else
        {
            total++;
            printBoard();
        }

        board[x][y]= last;
    }

    public boolean rightAvailability( int x, int y )
    {
        if( x+1 >= size ) return false;
        else if( board[x+1][y].equals("1") ) return false;
        else if( board[x+1][y].equals("P") ) return false;
        else return true;
    }
    public boolean leftAvailability( int x, int y )
    {
        if( x-1 < 0) return false;
        else if( board[x-1][y].equals("1") ) return false;
        else if( board[x-1][y].equals("P") ) return false;
        else return true;
    }
    public boolean aboveAvailability( int x, int y )
    {
        if( y+1 >= size ) return false;
        else if( board[x][y+1].equals("1") ) return false;
        else if( board[x][y+1].equals("P") ) return false;
        else return true;
    }
    public boolean belowAvailability( int x, int y )
    {
        if( y-1 < 0) return false;
        else if( board[x][y-1].equals("1") ) return false;
        else if( board[x][y-1].equals("P") ) return false;
        else return true;
    }

    public void printBoard()
    {
        System.out.println( "The board number " +total+ " is: ");
        for(int i=0; i< size; i++ )
        {
            for(int j=0; j< size; j++ )
            {
                if( (i==mX) && (j==mY) )
                {
                    System.out.print("M");
                }
                else if( (i==eX) && (j==eY) )
                {
                    System.out.print("E");
                }
                else if( board[i][j].equals("1") )
                {
                    System.out.print("1");
                }
                else if( board[i][j].equals("0") )
                {
                    System.out.print("0");
                }
                else
                {
                    System.out.print("P");
                }
            }
            System.out.println();
        }
    }
}

这是测试仪:

public class MazeTester 
{
    public static void main(String[] args) 
    {
        int size = 11;
        String[][] board = new String[][]
            {
                {"1","1","1","1","1","1","1","1","1","1","1"},
                {"1","0","0","0","0","0","1","0","0","0","1"},
                {"1","0","1","0","0","0","1","0","1","0","1"},
                {"E","0","1","0","0","0","0","0","1","0","1"},
                {"1","0","1","1","1","1","1","0","1","0","1"},
                {"1","0","1","0","1","0","0","0","1","0","1"},      
                {"1","0","0","0","1","0","1","0","0","0","1"},
                {"1","1","1","1","1","0","1","0","0","0","1"},
                {"1","0","1","M","1","0","1","0","0","0","1"},
                {"1","0","0","0","0","0","1","0","0","0","1"},
                {"1","1","1","1","1","1","1","1","1","1","1"},  
            };


        Maze m = new Maze( size, board );
        m.findPath();
    }
}

这是当前的输出:

The board number 1 is: 
11111111111
1PPPPP1PPP1
1P1PPP1P1P1
EP1PPPPP1P1
101111101P1
10101PPP1P1
10001P1PPP1
11111P1PP01
101M1P1PP01
100PPP1PP01
11111111111
The board number 2 is: 
11111111111
1PPPPP1PPP1
1P1PPP1P1P1
EP100PPP1P1
101111101P1
10101PPP1P1
10001P1PPP1
11111P1PP01
101M1P1PP01
100PPP1PP01
11111111111
The board number 348 is: 
11111111111
1PPPPP10001
1P1PPP10101
EP1PPPPP101
1011111P101
10101PPP101
10001P10001
11111P10001
101M1P10001
100PPP10001
11111111111

编辑:我添加了 if( board[x][y].equals("P") ) board[x][y] = "1";在 findIndex 的开头。我还解决了 x <= 0 问题。我将输出更新为我现在得到的内容(实际上是打印 348 个类似的板)。

最佳答案

我在该行添加了部分猜测:

else if( belowAvailability(x,y) )
{
        findNext(x, x-1);
}

x-1 应该是 y-1

您会发现的另一个问题是您正在使用 else if block 。如果遇到分支,请说

1E1
101
1P0
1P1

你会先尝试向右走,然后当它严重失败时,它就不会尝试向上。您实际上可以在测试输出中看到,

_._._789_._
_..._6_A54_
_____5_B23_
_._M_4_C10_
_..123_DEF_
___________

以十六进制编号,方便阅读。它进入右下角,然后卡住;由于无处可去,所以电路板被打印出来,递归结束时不会回溯到未经测试的方 block 。

再次编辑。仍在寻找,但在左/右可用性中,您有另一个 x/y 不匹配,并且您可能只想在 x-1 < 0(或 y-1)时拒绝可用性;因为目标节点位于 y=0。

通过这些更改,并且仅当 x==eX && y==eY 时才触发打印,我得到了解决方案的输出。解决方案有很多,但是解决方案。

编辑计数的另一个幽默事实:您可以向左/向右和向上/向下向后。 x 坐标指定您正在查看的输入的行,y 坐标指定列。在这种情况下使用 r/c 是相当常见的。

关于java - 如何找到所有可用的迷宫路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1523323/

相关文章:

javascript - karatsuba 算法,超出最大调用堆栈大小

perl - 全局变量在子程序中重置自身

java - 当其中一个线程完成指定任务时,如何注意到其他线程杀死自己?

java - java中如何在不使用标签名称的情况下提取xml标签值?

java - Selenium 测试失败 "Element is not clickable at..."

c - 由于重复递归而超出堆栈限制

algorithm - 找出到达迷宫任何角落的最少步数?

Java 正则表达式帮助

c++ - A*寻路慢

java - 使用单个 "update"JButton 将测试表的 auto_increment 值插入到分数表表中