中级农民
- 积分
- 103
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2021-1-7
- 最后登录
- 1970-1-1
|
- class Solution {
- public int shortestDistance(int[][] maze, int[] start, int[] destination) {
- Map<Integer, Integer> memo = new HashMap<>();
- Set<Integer> path = new HashSet<>();
- int shortest = dfsShortest(maze, start, destination, memo, path);
- return shortest == Integer.MAX_VALUE ? -1 : shortest;
- }
- private int dfsShortest(int[][] maze, int[] start, int[] dest, Map<Integer, Integer> memo, Set<Integer> path) {
- if (start[0] == dest[0] && start[1] == dest[1]) return 0;
- int startIdx = start[0]*maze[0].length+start[1];
- if (memo.get(startIdx) != null) return memo.get(startIdx);
- path.add(startIdx);
- int res = Integer.MAX_VALUE;
- for (int[] next : findNexts(maze, start)) {
- int nextIdx = next[0]*maze[0].length+next[1];
- if (!path.contains(nextIdx)) {
- int stepSize = Math.abs(next[0]-start[0]) + Math.abs(next[1]-start[1]);
- int nextToDest = dfsShortest(maze, next, dest, memo, path);
- if (nextToDest != Integer.MAX_VALUE) {
- res = Math.min(res, nextToDest+stepSize);
- }
- }
- }
- path.remove(startIdx);
- memo.put(startIdx, res);
- return res;
- }
- private List<int[]> findNexts(int[][] maze, int[] pos) {
- List<int[]> res = new ArrayList<>();
- int posX = pos[0];
- while (posX-1 >= 0 && maze[posX-1][pos[1]] == 0) posX--;
- if (posX < pos[0] && posX >= 0) res.add(new int[]{posX, pos[1]});
- posX = pos[0];
- while (posX+1 < maze.length && maze[posX+1][pos[1]] == 0) posX++;
- if (posX > pos[0] && posX < maze.length) res.add(new int[]{posX, pos[1]});
- int posY = pos[1];
- while (posY-1 >= 0 && maze[pos[0]][posY-1] == 0) posY--;
- if (posY < pos[1] && posY >= 0) res.add(new int[]{pos[0], posY});
- posY = pos[1];
- while (posY+1 < maze[0].length && maze[pos[0]][posY+1] == 0) posY++;
- if (posY > pos[1] && posY < maze[0].length) res.add(new int[]{pos[0], posY});
- return res;
- }
- }
复制代码 |
|