Java X×Y网格中路径数的计算算法

Java X×Y网格中路径数的计算算法,java,Java,我想用Java创建一个程序,计算机器人可以从网格左上角T(x,y)到左下角的路径数。。仅使用栅格中的每个方块一次,并使用栅格中的所有方块。机器人可以上下左右移动,使其更加复杂。我知道这是一个递归程序,但我不知道如何实现它。那么,你需要知道什么?你需要知道电路板的当前状态,以及机器人的位置。由此,您可以探索尚未访问的每个相邻单元。在探索每个单元格时,递归地应用算法以探索其相邻单元格。最终,每一次探索要么找到目标,要么失去机会 基本算法如下所示: explore(board, position) {

我想用Java创建一个程序,计算机器人可以从网格左上角T(x,y)到左下角的路径数。。仅使用栅格中的每个方块一次,并使用栅格中的所有方块。机器人可以上下左右移动,使其更加复杂。我知道这是一个递归程序,但我不知道如何实现它。

那么,你需要知道什么?你需要知道电路板的当前状态,以及机器人的位置。由此,您可以探索尚未访问的每个相邻单元。在探索每个单元格时,递归地应用算法以探索其相邻单元格。最终,每一次探索要么找到目标,要么失去机会

基本算法如下所示:

explore(board, position) {
  if (position == goal) {
    count++
    return
  }
  board.mark(position)
  for cell in position.neighbors
     if not board.ismarked(cell)
       explore(board, cell)
  board.unmark(position)
}

您需要跟踪自由方块的数量,当您到达左下角时,检查是否已用完所有方块

static int countPaths(boolean[][] grid) {
    int freeSquares = 0;
    for(int y = 0; y < grid.length; y++) {
        for(int x = 0; x < grid[y].length; x++) {
            if(grid[y][x]) freeSquares++;
        }
    }
    return _countPaths(grid, 0, 0, freeSquares);
}

static int _countPaths(boolean[][] grid, int x, int y, int freeSquares) {
    if(!grid[y][x]) return 0;
    if(y == grid.length-1 && x == 0) { // bottom left
        if(freeSquares == 1) return 1;
        else return 0;
    }
    int sum = 0;
    grid[y][x] = false;
    for(int dy = -1; dy <= 1; dy++) {
        for(int dx = -1; dx <= 1; dx++) {
            int newX = x+dx, newY = y+dy;
            if(newX < 0 || newY < 0 || newY >= grid.length || newX >= grid[y].length) continue;
            if((dx == 0 && dy == 0) || (dx != 0 && dy != 0)) continue;
            sum += _countPaths(grid, x+dx, y+dy, freeSquares-1);
        }
    }
    grid[y][x] = true;
    return sum;
}

public static void main (String args[]) {
    boolean[][] grid = {{true, true, true, false},
                        {true, true, true, false},
                        {true, true, true,  true},
                        {true, true, true,  true}};
    System.out.println(countPaths(grid));
}
static int countpath(布尔[][]网格){
int-freeSquares=0;
对于(int y=0;y
你可以开始使用IDE,编写一些代码,然后带着特定的问题回来。“我只是不知道从哪里开始。”从左上角开始。用文字描述你将如何递归地解决这个问题。提示:如果你的机器人在(0,0),并且他还没有访问过任何细胞,他可以去哪里?如果你的机器人从(0,0)移动到(0,1),他可以去哪里?问题是我不知道如何实现这个算法如果机器人在(0,0)位置,他可以向北和向东移动。如果它在1,1,它可以向各个方向移动,前提是它以前没有访问过任何一个正方形谢谢,但是你如何确保机器人访问网格中的每个正方形?啊-我忘记了这个要求。修改算法来实现这一点非常容易。实现并理解算法,你应该能够弄明白。好吧,莱米,试试这个。。哈哈,我想我需要一些帮助。投赞成票,效果很好。。在哪里可以修改网格大小?当前的是4x4…例如,如果我需要6乘8,很高兴你喜欢。顺便说一句,您可以使用任意网格大小。只需创建一个大小合适的布尔数组,并用true填充它。是的,我可以很容易地更改网格大小。。谢谢你。。。你只是把它记在脑子里了#只是想知道