Java 在0';s和1';s
我正在制定一项计划,其中规定: 您将获得一个包含M行和N列的二维矩阵。您最初位于(0,0),这是数组中左上角的单元格。你可以向右或向下移动。数组中填充了1和0。1表示可以通过该单元格移动,0表示不能通过该单元格移动。返回从左上角单元格到右下角单元格的路径数。(即(0,0)到(M-1,N-1))。因为答案可能很大,所以您必须返回ans%(10^9+7) 我尝试过实现它,但在某些情况下它是有效的,但在某些情况下失败了:Java 在0';s和1';s,java,matrix,Java,Matrix,我正在制定一项计划,其中规定: 您将获得一个包含M行和N列的二维矩阵。您最初位于(0,0),这是数组中左上角的单元格。你可以向右或向下移动。数组中填充了1和0。1表示可以通过该单元格移动,0表示不能通过该单元格移动。返回从左上角单元格到右下角单元格的路径数。(即(0,0)到(M-1,N-1))。因为答案可能很大,所以您必须返回ans%(10^9+7) 我尝试过实现它,但在某些情况下它是有效的,但在某些情况下失败了: static int count(int a[][], int i, int j
static int count(int a[][], int i, int j) {
int rows = a.length;
int cols = a[0].length;
if(a[i][j] == 0) return 0;
if (i == rows - 1 && j == cols - 1)
return a[i][j];
else if (i == rows - 1)
return a[i][j + 1];
else if (j == cols - 1)
return a[i + 1][j];
else if (a[i][j] == 1)
return count(a, i + 1, j) + count(a, i, j + 1);
else
return 0;
}
以下阵列失败:
{{1,1},{0,1}
你能帮我看看这个节目有什么问题吗
更新:
谢谢@Johnny Mopp,它解决了上面的测试用例。如何提高该程序的性能?首先,如果要检查
a[i][j]
的值。它是0,您应该返回0
关于性能,用这种方法编写的算法非常慢,因为要多次计算相同的值。使用记忆法(创建第二个数组并保存返回的每个值,如果以前没有计算过,则在函数检查开始时首先保存),或使用动态编程进行求解
编辑:你忘记了你的模10^9+7
第二次编辑(回应您的评论):
应该是这样的。我将它划分为三个循环,这样主(第三个)循环的操作就更少了,对于大数据来说,功能就更快了。我也改变了计算的方向,但这一点都不重要
static int count_dp(int a[][]){
int rows = a.length;
int cols = a[0].length;
int[][] dp = new int[rows][cols];
dp[0][0] = a[0][0];
for(int i=1;i<rows;i++)
if(dp[i-1][0]==1 && a[i][0]==1)
dp[i][0] = 1;
for(int i=1;i<cols;i++)
if(dp[0][i-1]==1 && a[0][i]==1)
dp[0][i] = 1;
for(int i=1;i<rows;i++)
for(int j=1;j<cols;j++)
if(a[i][j]==1)
dp[i][j] = (dp[i-1][j] + dp[i][j-1])%1000000007;
return dp[rows-1][cols-1];
}
静态整数计数\u dp(整数a[]]{
int行=a.length;
int cols=a[0]。长度;
int[][]dp=新的int[行][cols];
dp[0][0]=a[0][0];
对于(int i=1;我认为首先需要检查单元格的值。例如:如果(a[i][j]==0)返回0;
“它不工作”这对我们没有帮助。程序失败时会做什么,它与预期的行为有何不同?我同意Johnny Mopp的观点。如果您所在的单元格的值为0且在边界上,那么您的代码现在将在该边界上继续,而不是返回0。创建一个矩阵来存储哪个单元格中有多少wa从中删除,然后将其作为控件打印?最好使用调试器解决此类问题(请参见此处:)@Johnnymop,谢谢你,它现在起作用了,有没有办法提高这个程序的性能?你能给我一个如何使用动态编程的片段吗?类似于你的算法,但你不使用递归。创建第二个相同大小的数组。然后你只需按正确的顺序循环数组(例如)(int i=rows-1;i>=0;i--)for(int j=cols-1;j>=0;j--)
)和现在一样计算值,但不是递归,而是从数组中获取以前计算的值。我尝试了这种方法,但无法得到答案,请您提供一个使用动态编程的解决方案好吗?答案是肯定的。我之前有一个DP解决方案,从右下角开始,到左上角,答案是dp[0][0]。我对您的优化非常感兴趣。我的I,j循环有4个if语句,现在可以看到您如何去掉其中的三个(底部/右侧单元格和每个外部行/列),只留下一个if语句。非常好。。。
def path_finder(i,j,m,l,n):
if i==n-1 and j==n-1:
if m[i][j]==1:
l.append([i,j])
return 1
else:
return 0
if i==n or j==n:
return 0
if m[i][j]==0:
return 0
l.append([i,j])
fl=path_finder(i+1,j,m,l,n) #vertical movement
fr=path_finder(i,j+1,m,l,n) #horizontal movement
if not (fl or fr):
l.pop()
return 0
return 1
if __name__=='__main__':
n=4 #size od matrix
i=0
j=0
m=[[1,1,1,0],
[1,0,1,1],
[1,1,0,1],
[1,1,0,1]]
l=[] #empty list to store path indices
found=path_finder(i,j,m,l,n)
if found==1:
for i in l:
print('({0},{1})'.format(*i),end=' ')
else:
print(-1)
# A recursive approach to the solution.
# Works for all values of n if we can move only right and
down. Fails if we have to move up or left,Eg: for matrix
shown below we have to move up in order to get to n, n
[[1 1 1 1 1],
[1 0 0 0 0],
[1 0 1 1 1],
[1 0 1 0 1],
[1 1 1 0 1]]