LintCode題解 |亞馬遜、微軟熱門題:目的地的最短路徑


亞馬遜、微軟熱門題:目的地的最短路徑

題目描述

給定表示地圖上座標的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 進行在線評測設計

相關文章
相關標籤/搜索