中级农民
- 积分
- 102
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-12-19
- 最后登录
- 1970-1-1
|
第三题followup应该是dijkstra的思路吧?
heap里push进{i,j,steps,walls}.
bfs过程中每次只push进 走到下一个点number of break walls <= 1的点,
最后poll出来的点能到destination就直接返回那个step
- public static int shortest(int[][] M, int[] start, int[] end){
- int m = M.length;
- int n = M[0].length;
- Integer[][] dist = new Integer[m][n];
- PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> (a[2] - b[2]));
- heap.offer(new int[]{start[0], start[1], 0, 0});
- int[][] dirs = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
- while(!heap.isEmpty()){
- int[] cur = heap.poll();
- int i = cur[0];
- int j = cur[1];
- int steps = cur[2];
- int walls = cur[3];
- dist[i][j] = steps;
- if(i == end[0] && j == end[1]){
- return steps;
- }
- for(int[] dir : dirs){
- int ni = i + dir[0];
- int nj = j + dir[1];
- if(ni >= 0 && ni < m && nj >= 0 && nj < n && dist[ni][nj] == null && (walls + M[ni][nj] <= 1)){
- int nwalls = walls + M[ni][nj];
- heap.offer(new int[]{ni, nj, steps + 1, nwalls});
- }
- }
- }
- return -1;
- }
复制代码 |
|