当前位置: 首页 > 知识库问答 >
问题:

在网格上的DFS中添加返回语句会导致异常

穆彬郁
2023-03-14

所以这个问题要求打印出在一个mxn网格中从(1,1)到(M,N)的所有路径,以及相同路径的总数。

把M和N都作为输入。M和N是矩形板上的行数和列数。我们的球员从左上角开始,必须到达右下角。在一次移动中,玩家可以水平移动一步(右)或垂直移动一步(下)或斜向移动一步(东南)。

>

  • 编写一个递归函数,返回玩家可以跨板旅行的不同方式的计数。打印返回的值。

    编写一个递归函数,打印所有有效路径的移动(void是函数的返回类型)。

    Input:
    
    3 3
    
    Output:
    
    VVHH VHVH VHHV VHD VDH HVVH HVHV HVD HHVV HDV DVH DHV DD
    13
    
    import java.util.*;
    public class Main {
        static int count = 0;
        public static void main(String args[]) {
            Scanner sc = new Scanner(System.in);
            
            int m = sc.nextInt();
            int n = sc.nextInt();
    
            dfs(m, n, 0, 0, new int[m][n], "");
            System.out.print("\n" + count);
    
            sc.close();
        }
    
        static void dfs(int m, int n, int i, int j, int[][] board, String path) {
    
            if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] == 1) {
                return;
            }
    
            board[i][j] = 1;
    
            if (i == m - 1 && j == n - 1) {
                count++;
                System.out.print(path + " ");
                return; // this line when included does cause problem
            }
    
            dfs(m, n, i + 1, j, board, path + "V");
            dfs(m, n, i, j + 1, board, path + "H");
            dfs(m, n, i + 1, j + 1, board, path + "D");
    
            board[i][j] = 0;
        }
    }
    

    但当我包含return语句时,输出是:

    Input:
    
    3 3
    
    Output:
    
    VVHH 
    1
    

    我不明白为什么在我们已经处于董事会最底层的情况下,有返回声明会有不同。

    欢迎任何解释。

  • 共有2个答案

    温源
    2023-03-14

    到达单元格后,您无需对其进行标记。因为只要你向右,向下或向右,你永远不会到达同一个细胞。因此,board[][]是不必要的。

    static int count = 0;
    
    static void dfs(int m, int n, int i, int j, String path) {
        if (i < 0 || i >= m || j < 0 || j >= n) {
            return;
        }
        if (i == m - 1 && j == n - 1) {
            count++;
            System.out.print(path + " ");
            return;
        }
        dfs(m, n, i + 1, j, path + "V");
        dfs(m, n, i, j + 1, path + "H");
        dfs(m, n, i + 1, j + 1, path + "D");
    }
    
    public static void main(String[] args) {
        dfs(3, 3, 0, 0, "");
        System.out.println();
        System.out.println(count);
    }
    

    输出:

    VVHH VHVH VHHV VHD VDH HVVH HVHV HVD HHVV HDV DVH DHV DD 
    13
    
    皇甫繁
    2023-03-14

    问题在于这一行:

    board[i][j] = 0;
    

    如果返回时未重置电路板,则结果将不正确。如果您在if语句中返回,则会发生这种情况,因为此行board[i][j]=0 行无法到达。

    一个解决方案是将该行添加到if语句中:

    if (i == m - 1 && j == n - 1) {
        count++;
        System.out.print(path + " ");
        board[i][j] = 0;
        return;
    }
    

     类似资料:
    • 我有一个POJO类,用于使用Jackson进行反序列化。这个类包含所有类变量的默认构造函数、getter和setter方法<因为我需要一些关于POJO内容的高级逻辑,所以我添加了一个方法 但现在,我的单元测试在反序列化过程中失败,只有以下例外: 在我看来,Jackson似乎识别了一个get方法,并由此推断出,反序列化必须有一个类似的JSON属性 当我用@JsonIgnore注释方法时,测试成功了。

    • 这将导致以下生成错误: TaskExecutionException:任务“:App:TransformResourcesWithMergeJavaResforDebug”执行失败。在org.gradle.api.internal.tasks.execution.executeActionStaskExecuter.java:103),在org.gradle.api.internal.tasks.

    • 我正在尝试创建多个JavaFX应用程序,直到现在,当我尝试添加时,还没有遇到任何问题。我可以有一个全新的文件,并包括初始化的一行,这将导致异常。我在网上找遍了,什么也没有得到。仅仅添加TextField就会导致异常甚至出现在其他先前运行的k程序中。以下示例: 到目前为止我创建的程序:

    • 我正在尝试在联接。但是对我来说,缺少一个功能。我为员工创建了,这些网格分为特定的部门,但有员工,这些员工仅在部门中。 不允许在一上添加。 所以结果应该是这样的: 即使< code>Vaadin不直接允许,有什么解决方案可以让我这样做吗? 因为如果我尝试过,它会引发异常

    • 问题内容: 我正在用Java开发与MySQL db通信的应用程序,而在测试它时,我注意到在表中插入新行的代码引发了MySQLSyntaxError异常,因此我尝试使用MySQL Workbench执行相同的INSERT,而且有效。有问题的代码是这样的: 编辑:对不起,堆栈跟踪是: 问题答案: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExcep

    • 我不得不使用全局变量found来指示在哪里找到了一个和。返回语句始终未定义。 此外,如果在下面的if语句中使用return语句,代码将无法正常工作。 这不是问题的最佳解决方案,但这是我得到的工作版本。 返回语句之间的****,删除时代码工作,否则我要么得到false或未定义。我不明白这部分!为什么删除返回就能解决问题,我认为每个递归调用都必须用返回语句进行。 问题可能是由于多次呼叫造成的吗?我是不