给定一个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!因此,正如您将编写的任何其他方法一样。
可以使用重载。
您不能更换垫子。
更改此
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,但不超过它。 这是我使用动态编程的尝试: 那么在我的代码中是否有任何可能的优化可以帮助我降