【问题标题】:Adding return statement in DFS on grid causes abnormality在网格上的DFS中添加return语句导致异常
【发布时间】:2022-07-17 13:19:41
【问题描述】:

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

问题陈述

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

  • 编写一个递归函数,返回玩家可以在棋盘上移动的不同方式的计数。打印返回的值。

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

预期输入/输出:

Input:

3 3

Output:

VVHH VHVH VHHV VHD VDH HVVH HVHV HVD HHVV HDV DVH DHV DD
13

我的 JAVA 解决方案

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

我不明白为什么当我们已经在板子的最右下方时有 return 语句会有所不同。

欢迎任何解释。

【问题讨论】:

    标签: java recursion depth-first-search maze


    【解决方案1】:

    问题出在这一行:

    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;
    }
    

    【讨论】:

      【解决方案2】:

      您不必在到达单元格后对其进行标记。因为只要你往右、往下或往下走,你永远不会到达同一个牢房。因此,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
      

      【讨论】:

        【解决方案3】:

        您刚刚回复了我的一篇帖子,并在我评论时将其删除。我没有否决您的回答!我猜是别人读的,idk!请再次发布。我实际上是想问你一些事情,我会继续粘贴我写的评论,希望你能回答(英语不是我的主要语言)

        嘿!我没有这样做,哈哈,我根本不投票。我还在努力 阅读并理解 while 循环,我有两个问题,什么是 “passwordSize--> 0”是什么意思?为什么不只是“passwordSize > 0”?还, .push 函数我猜它添加了已经声明的东西 数组?就像如果你让数组 ["0"] 你按下 "1" 并知道它 [“0”,“1”],对吧?感谢你的回答! :D

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-20
          • 2018-03-15
          • 2011-04-15
          • 2019-09-04
          • 2013-03-15
          • 1970-01-01
          相关资源
          最近更新 更多