算法题解:走方格问题大汇总(持续更新JAVA代码)
Q1. 在给定的Matrix中寻找路径
给定一个二维数组,求是否存在一条从左上角移动到右下角的路径。在给定的二维数组中,单元格的值为-1时表示不能通过;单元格的值为0时,表示可以通过。
例如:给定一个二维数组如下:
{ 0, 0, 0, -1, 0},
{-1, 0, 0, -1, -1},
{ 0, 0, 0, -1, 0},
{-1, 0, 0, 0, 0},
{ 0, 0, -1, 0, 0}
路径存在,返回YES
{ 0, 0, 0, -1, 0},
{-1, 0, 0, -1, -1},
{ 0, 0, 0, -1, 0},
{-1, 0, -1, 0, 0},
{ 0, 0, -1, 0, 0}
路径不存在,返回NO
算法分析
这个问题简单的解决方法是通过 BFS 或 DFS 算法来查找是否存在符合条件的路径(Path)。
更好的解决方法是通过将所有可访问节点的值更改为1来标记它们。
首先,将左上角第一个元素的值标记为1。然后在第一行中获取下一个(当前)值并与前一个值进行比较。仅当当前值可到达时(不等于-1),才将其设置为前一个值。同样,对列值执行相同的操作,方法是将当前值与前一列的值(如果可以访问)进行比较并设置。
然后从第一行和第一列开始,并获取前一行和前一列的值。找到它们之间的最大值,并将当前索引设置为该最大值。如果当前索引值为-1,则不会有任何更改。
最后,如果右下角的最终索引为1,则返回“是”,否则返回“否”。
package com.bean.algorithm.basic;
public class FindthePathinMatrix {
// 寻找是否存在一条路径从左上角通向右下角
static boolean isPath(int arr[][]) {
int row=arr.length;
int col=arr[0].length;
// 设置左上角的第一个元素值为1,即 arr[0][0] = 1
arr[0][0] = 1;
//标记从左上到右下的元素位置是否可以访问(visited)从第1行第1列开始
for (int i = 1; i < col; i++) {
if (arr[0][i] != -1) {
arr[0][i] = arr[0][i - 1];
}
}
for (int j = 1; j < row; j++) {
if (arr[j][0] !=