【发布时间】:2018-12-04 13:30:50
【问题描述】:
这个问题是在我对 Java 的期末考试中提出的:
给定一个正数矩阵(未排序)m、一个整数sum 和另一个矩阵p,它到处都是0。
递归检查m 中是否存在一条路径,它的总和等于sum。
规则:
您只能在数组中向下、向上、向左或向右移动。
找到路径后,矩阵p将在正确的路径上填充1's。
只有一条路径
方法完成后,p 上的所有其他单元格应为 0。
如果没有办法得到这笔钱,你会留下p,就像你得到他一样。
示例:
int[][] p = {{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}};
一开始。
矩阵是:
int [][] hill = {{3,8,7,1},
{5,15,2,4},
{12,14,-13,22},
{13,16,17,52}};
如果您在 sum = 23 上调用该方法,该方法将返回 true ,而 p 将是:
int[][] p = {{1,0,0,0},
{1,1,0,0},
{0,0,0,0},
{0,0,0,0}};
方法必须是递归的
这个问题简直把考试搞得一团糟……
希望你能弄清楚,也许能帮助我理解它!谢谢
我的进步:
public static boolean findSum(int[][] mat , int sum , int[][]path){
return findSum(mat,sum,path,0,0);
}
private static boolean findSum(int[][] m, int sum, int[][] p, int i, int j) {
if (i>=m.length || j>= m[i].length) return false;
boolean op1 = finder(m,sum-m[i][j],p,i,j);
boolean op2 = findSum(m,sum,p,i+1,j);
boolean op3 = findSum(m,sum,p,i,j+1);
if (op1) return true;
else if (op2) return true;
return op3;
}
private static boolean finder(int[][] m, int sum,int[][]p , int i, int j) {
if (sum==0) {
p[i][j]=1;
return true;
}
p[i][j]=1;
boolean op1=false,op2=false,op3=false,op4=false;
if (i>0 && p[i-1][j]==0 && sum-m[i][j]>=0) op1 = finder(m, sum - m[i][j], p, i - 1, j);
if (i<m.length-1 && p[i+1][j]==0&& sum-m[i][j]>=0) op2 = finder(m, sum - m[i][j], p, i + 1, j);
if (j>0 && p[i][j-1]==0&& sum-m[i][j]>=0) op3 = finder(m, sum - m[i][j], p, i, j - 1);
if (j<m[i].length-1 && p[i][j+1]==0&& sum-m[i][j]>=0) op4 = finder(m, sum - m[i][j], p, i, j + 1);
else p[i][j]=0;
return op1||op2||op3||op4;
}
【问题讨论】:
-
请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作摘要,以及对您在解决它时遇到的困难(help center,How to Ask)。
-
您只发布了任务。特别是你忘了问一个问题。以及你自己的想法和尝试,以及对你没有得到什么的具体描述。
-
@EJoshuaS 添加了队友
-
@t0nty 路径是否必须从第 0 个索引开始?或者它可以从任何地方开始?
标签: java recursion backtracking