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

给定2d整数数组,找到递归求和到给定数字的路径

邬宜然
2023-03-14

给定一个2d数组,我需要返回一个具有路径的矩阵,该路径递归地求和到给定的数字。

路径矩阵应为零,但总计为给定数字的路径除外,该路径将标记为1。

路径只能在

我尝试过所有的可能性,首先检查我是否已经去过下一个街区。

问题是在一些迭代之后,它会停止,并且不会返回并再次将块清除为0。

private static boolean paintPath(int[][] mat, int sum, int[][] path , int i, int j){

        if(sum<0)
            return false;

        path[i][j] = 1;

        if(sum == 0)
            return true;
        printMat(path);
        System.out.println();

        if(withinBoundaries(mat,i+1,j) && path[i+1][j] != 1)
            if(paintPath(mat,sum - mat[i][j],path,i+1,j))
                return true;

        if(withinBoundaries(mat,i,j+1) && path[i][j+1] != 1)
            if(paintPath(mat,sum - mat[i][j],path,i,j+1))
                return true;

        if(withinBoundaries(mat,i-1,j) && path[i-1][j] != 1)
            if(paintPath(mat,sum - mat[i][j],path,i-1,j))
                return true;
        if(withinBoundaries(mat,i,j-1) && path[i][j-1] != 1)
            if(paintPath(mat,sum - mat[i][j],path,i,j-1))
                 return true;

        path[i][j] = 0;
        return false;

    }

给定

int[][] mat1 = {
                {1,1,1,1},
                {5,100,100,1},
                {100,100,100,1},
                {1,1,1,1}
        };


 int[][] path = {
                {0,0,0,0},
                {0,0,0,0},
                {0,0,0,0},
                {0,0,0,0}
        };

在通话中

paintPath(mat1, 5, path, 0, 0);

我以为算法会回来

        {0,0,0,0},
        {1,0,0,0},
        {0,0,0,0},
        {0,0,0,0}

我得到

1   1   1   1   
0   0   1   1   
0   0   0   0   
0   0   0   0

相反

调用paintPath(mat1400,path,0,0);我想

        {0,0,0,0},
        {0,1,1,0},
        {0,1,1,0},
        {0,0,0,0}

        {0,0,0,0},
        {0,0,1,0},
        {1,1,1,0},
        {0,0,0,0}

问题是,我的算法从(0,0)开始,然后从那里寻找路径,我需要它从任何起点找到任何路径(没有循环)

编辑:作业中引用的问题:“我们将数组中的路径定义为相邻单元格的集合。相邻的cekks可以从左、右、上、下相邻,但不能对角线相邻。每个单元格只能访问一次路径。编写一个递归方法,它接受一个包含大于0的整数、一个整数和正数的2d数组路径和一个与mat相同大小的2d数组路径。

该方法需要检查数组中是否存在其值之和等于sum的路径。如果有这样的路径,它应该返回true、false或otherwize。

数组路径用于标记其求和等于求和的路径。

路径单元格中的位置为1,其他单元格中的位置为0。

该方法必须是不带循环的RECCURSITIVE!因此,正如您将编写的任何其他方法一样。

可以使用重载。

您不能更换垫子。

共有1个答案

许博
2023-03-14

更改此

path[i][j] = 1;

if(sum == 0)
  return true;
printMat(path);
System.out.println();

对此:

if(sum == 0){
  printMat(path);
  System.out.println();
  return true;
}

path[i][j] = 1;

请注意,您将获得输出,

{0,0,0,0},
{1,0,0,0},
{0,0,0,0},
{0,0,0,0}

如果您将起始呼叫更改为

paintPath(mat1, 5, path, 1, 0);
 类似资料:
  • 给定一个数组大小n和一个正数max(max表示我们可以用来放置在数组中的数字范围)。 我想计算我可以在数组中放置多少个排序数字的组合。 例如: 如果n=3,则最大值为2。(我们只能使用1/2的数字,因为最大值是2)因此有4种排序数组组合 我编写了一些代码,并成功地通过了这个特定的示例,但任何其他示例 我发现的问题是,当递归到达最后一个索引时,它不会尝试第三个数字,而是向后折叠。 我的代码:

  • 给定一组整数(正数或负数),我怎样才能找到一个和给定值相加的数字序列? 示例:给定一个数字列表,我需要求和。我可以选择序列(数字可以重复使用)或。我正试图找到一种有效的方法来缩短序列的长度。 这就像(http://en.wikipedia.org/wiki/Subset_sum)但就我而言,数字可以重复使用。 这也有点像分区问题(找到所有可能的子集,求和到一个给定的数字),但在我的例子中有负值。

  • 我正在寻找以下问题的答案。 给定一组整数(无重复项)和一个和,找出集合元素的所有可能组合,并求和。解的顺序并不重要(解{2,2,3}和{3,2,2}是相等的)。 请注意,最终组合不需要是集合,因为它可以包含重复。 示例:集合{2,3,5}和10 结果:{2, 2, 2, 2, 2},{2,2,3,3},{2,3,5},{5,5} 我已经研究过子集和问题以及硬币兑换问题,但不能使它们适应我的需要。我

  • 我遇到的问题如下: 对于给定的不同十进制数字数组(0,1,2,3...,8,9)编写一个递归函数,返回由给定数字组成的所有自然数的总和。例如,对于数组{1,2},您将获得12 21 2 1 = 36 我想的是如果你有一个数组1,2,3 您可以将最后一个数字“放在一边”,并将剩下的较小的一组按如下方式排列: 1 2 3 2 1 3 2 3 1 3 3 这将是10*[perm(1,2)]3*(重复次数

  • 我有一个很难处理的任务。 我试图编写一个递归函数(完全没有循环),给定一个数组及其长度,它将打印一对子数组,每个子数组的和将是整个数组和的一半。换句话说,数组被分成两组整数,以便它们的和相等。 例如,给定数组{1,2,2,0,5},函数应输出{1,2,2}{0,5} 我必须递归地做,用一个只得到数组本身及其大小的函数。我也只允许使用一个额外的递归函数来解决这个问题。 任何想法或想法都将受到最大的赞

  • 我知道这是一个背包问题,其中权重和值相等,但我认为我在编码逻辑上犯了一个错误,因为即使对于数组中元素的数量(N)为50并且所需的最大总和(M)4500。 为了澄清这个问题,我们得到了一个由N个正整数和一个正整数M组成的数组。数组元素只能使用一次。我们必须找到这个数组的子集(不一定是连续的),使得总和最接近M,但不超过它。 这是我使用动态编程的尝试: 那么在我的代码中是否有任何可能的优化可以帮助我降