【问题标题】:Determine minimum number of moves to reach top left corner of 2-D array确定到达二维数组左上角的最小移动次数
【发布时间】:2022-01-10 17:54:40
【问题描述】:

我正在解决一些 leetcode 问题并遇到了这个问题:

给定一个二维数组,例如:

given[][] = { {1, 6, 2},
              {1, 6, 4},
              {1, 9, 2} }

数组中的每个单元格代表我必须从该单元格移动的次数。每次停在一个单元格上时,我只能向上或向左移动。我想找到从数组右下角到左上角单元格所需的最少移动次数。

例如,在给定的数组中,我应该返回 2,从 given[2][2]given[0][2]given[0][0],因为这是最短的可能路径。如果无法到达左上角,我应该返回-1。

我什至不知道从哪里开始。任何人都可以提供任何指示吗?我在想我可以将其表示为图表并应用 Djikstra 算法,但我不知道这是否是一个可行的解决方案。

【问题讨论】:

  • 做,只是从右下角开始的 BFS。始终检查边界,并确保您不会通过跟踪访问的单元格来重复访问。您首先登陆0, 0 将是最短路径
  • 另外,我很好奇。想链接吗?
  • 如果你可以only向上或向左移动,这是否意味着这里只有两个可能的正确遍历(长度为2和3)?
  • @user1984 我的一个朋友给我发了这个问题,让我看看它——我不确定它来自哪里:(
  • @chrylis-cautiouslyoptimistic- 是的,有一个长度为 3 的有效遍历,但由于还有一个长度为 2 的遍历,所以我只返回它,因为它更小。

标签: java arrays algorithm


【解决方案1】:

我假设所有元素都是正数。

static int minMoves(int[][] given, int x, int y, int count) {
    if (x < 0 || y < 0)
        return Integer.MAX_VALUE;
    if (x == 0 && y == 0)
        return count;
    int step = given[x][y];
    return Math.min(minMoves(given, x - step, y, count + 1),
        minMoves(given, x, y - step, count + 1));
}

static int minMoves(int[][] given) {
    int count = minMoves(given, given.length - 1, given[0].length - 1, 0);
    return count == Integer.MAX_VALUE ? -1 : count;
}

public static void main(String[] args) {
    int[][] given = {{1, 6, 2}, {1, 6, 4}, {1, 9, 2}};
    int result = minMoves(given);
    System.out.println(result);
}

输出:

2

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2021-07-02
    相关资源
    最近更新 更多