給定表示地圖上座標的2D數組,地圖上只有值0,1,2.0表示能夠經過,1表示不可經過,2表示目標位置。從座標[0,0]開始,你只能上,下,左,右移動。找到能夠到達目的地的最短路徑,並返回路徑的長度。面試
(地圖必定存在且不爲空,而且只存在一個目的地)算法
樣例1數組
輸入:
[
[0, 0, 0],
[0, 0, 1],
[0, 0, 2]
]
輸出: 4
說明: [0,0] -> [1,0] -> [2,0] -> [2,1] -> [2,2]複製代碼
樣例2:bash
輸入:
[
[0,1],
[0,1],
[0,0],
[0,2]
]
輸出: 4
說明: [0,0] -> [1,0] -> [2,0] -> [3,0] -> [3,1]複製代碼
1.此題相似騎士遍歷題,但騎士遍歷題的檢查target是檢查座標,這題是檢查value。因此若是在struct Point裏面加上value這一項要確保target=2的值沒有被改掉。網站
2.此題不須要visited map,由於能夠簡單的將targetMap[i][j]設爲1,這樣下次就不用再訪問了。ui
3.In the validPlace(), 要確保先檢查p.x和p.y的範圍,而後再檢查grid[p.x][p.y]的值,否則就segment fault。spa
/**
* 本參考程序來自九章算法,由 @九章算法助教團隊 提供。版權全部,轉發請註明出處。
* - 九章算法致力於幫助更多中國人找到好的工做,教師團隊均來自硅谷和國內的一線大公司在職工程師。
* - 現有的面試培訓課程包括:九章算法班,系統設計班,算法強化班,Java入門與基礎算法班,Android 項目實戰班,
* - Big Data 項目實戰班,算法面試高頻題班, 動態規劃專題班
* - 更多詳情請見官方網站:http://www.jiuzhang.com/?source=code
*/
public class Solution {
/**
* @param targetMap:
* @return: nothing
*/
public int shortestPath(int[][] targetMap){
// Write your code here
int lenPath = 0;
int targetX = 0;
int targetY = 0;
for (int i = 0; i < targetMap.length; i++) {
for (int j = 0; j < targetMap[0].length; j++) {
if (targetMap[i][j] == 2) {
targetX = i;
targetY = j;
}
}
}
lenPath = bfs(targetMap, targetX, targetY);
return lenPath;
}
int[] dx = { 0, 1, 0, -1 };
int[] dy = { 1, 0, -1, 0 };
public int bfs(int[][] targetMap, int targetX, int targetY) {
int height = targetMap.length;
int width = targetMap[0].length;
Queue<Point> q = new LinkedList<Point>();
q.offer(new Point(0, 0));
int[][] deep = new int[height][width];
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
deep[i][j] = -1;
}
}
deep[0][0] = 0;
while (q.size() > 0) {
Point p = q.poll();
if (p.x == targetX && p.y == targetY) {
break;
}
for (int i = 0; i < 4; i++) {
int x = p.x + dx[i];
int y = p.y + dy[i];
if (x >= 0 && x < height && y >= 0 && y < width && targetMap[x][y] != 1 && deep[x][y] == -1) {
deep[x][y] = deep[p.x][p.y] + 1;
q.offer(new Point(x, y));
}
}
}
return deep[targetX][targetY];
}
}複製代碼
點擊 LintCode 進行在線評測設計