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

时间:2019-05-22 16:08:01

标签: java recursion

给定一个二维数组,我需要递归返回一个矩阵,该矩阵的路径总和为给定数。

除了总和等于给定数字的路径(标为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(mat1,400,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)开始并从那里寻找路径,我需要它从任意起点(无循环)找到 any 路径

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

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

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

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

该方法必须是无循环的递归! 就像您将要编写的其他任何方法一样。

您可以使用重载。

你不能换垫子。

1 个答案:

答案 0 :(得分:2)

更改此

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