# 2577. Minimum Time to Visit a Cell In a Grid ###### tags: `Leetcode` `Hard` `BFS` `Priority Queue` `Dijkstra` Link: https://leetcode.com/problems/minimum-time-to-visit-a-cell-in-a-grid/description/ ## 思路 本质上就是一道dijkstra 记录每个点能到达的最短时间 然后每次在priority queue里面取能最快到的点 然后遍历它的邻居 唯一不同的地方在于如果邻居的minimum time to visit>现在的time+1 说明我们不能直接到那边去 而是要在旁边绕圈 一会再回来 我们可以选择在prev 和curr node中间来回走 curr->prev->...->curr->next 这时候我们会发现如果next和curr差一个偶数 那么我们只能在next+1到达 但是如果中间差一个奇数 那么我们就可以在next到达 ## Code ```java= class Solution { public int minimumTime(int[][] grid) { int m = grid.length, n = grid[0].length; if(grid[0][1]>1 && grid[1][0]>1) return -1; Queue<int[]> pq = new PriorityQueue<>((a,b)->(a[0]-b[0])); pq.add(new int[]{0, 0, 0}); int[][] dirs = new int[][]{{0,1}, {0,-1}, {1,0}, {-1,0}}; boolean[][] visited = new boolean[m][n]; visited[0][0] = true; while(!pq.isEmpty()){ int[] curr = pq.poll(); int time = curr[0], row = curr[1], col = curr[2]; if(row==m-1 && col==n-1) return time; for(int[] dir:dirs){ int nextx = row+dir[0]; int nexty = col+dir[1]; if(nextx<0 || nextx>=m || nexty<0 || nexty>=n || visited[nextx][nexty]) continue; int nextTime = time + 1; if(grid[nextx][nexty]>time+1) nextTime = ((grid[nextx][nexty]-time)%2==0?1:0)+grid[nextx][nexty]; pq.add(new int[]{nextTime, nextx, nexty}); visited[nextx][nexty] = true; } } return -1; } } ```