給定騎士在棋盤上的 初始 位置(乙個2進製矩陣 0 表示空 1 表示有障礙物),找到到達 終點 的最短路線,返回路線的長度。如果騎士不能到達則返回 -1 。說明
如果騎士的位置為 (x,y),他下一步可以到達以下這些位置:例1:(x + 1, y + 2)
(x + 1, y - 2)
(x - 1, y + 2)
(x - 1, y - 2)
(x + 2, y + 1)
(x + 2, y - 1)
(x - 2, y + 1)
(x - 2, y - 1)
輸入:例2:[[0,0,0],
[0,0,0],
[0,0,0]]
source = [2, 0] destination = [2, 2]
輸出: 2
解釋:[2,0]->[0,1]->[2,2]
輸入:樸素bfs搜搜最短路,bfs概括來說就是像雷達一樣,一層一層進行尋找目標點。當找到目標點後進行回溯。從而找到最佳路徑。也就是說每走一步都要找到到達該點的最短的路徑,最終得到到達所有點的最短路徑,這題每一次的下一步做了規定,按照日字形跳到下一步。[[0,1,0],
[0,0,1],
[0,0,0]]
source = [2, 0] destination = [2, 2]
輸出:-1
根據下一跳位置建立方向陣列
dx=[1, 1, 2, 2, -1, -1, -2, -2]遍歷八個方向,進行搜尋dy=[2, -2, 1, -1, 2, -2, 1, -1]
用grid陣列標註是否訪問過某點
注意判斷下一跳的位置是否越界
複雜度分析
時間複雜度o(n*m)
最多跑一邊圖 n為圖的行數,m為圖的列數,最多跑一邊圖,即n*m
空間複雜度o(n*m)
所有點的資訊 n為圖的行數,m為圖的列數
public
class
solution
//定義搜尋的8個方向
int[
] dx =
;int
dy =
;//定義乙個節點的佇列,用於儲存走過的節點
queue
queue =
newlinkedlist
<
>()
;//新增起點到佇列
queue.
offer
(source)
;//將起點在grid中設定為true,即已經走過
grid[source.x]
[source.y]
=true
;//定義走出的步數
int step =0;
while
(!queue.
isempty()
)//遍歷8個方向上下乙個節點
for(
int i =
0; i <
8; i++)}
} step++;}
return-1
;}//判斷是否越界
private
boolean
is_in_bound
(point next,
int n,
int m)
}
lintcode 騎士的最短路線
給定騎士在棋盤上的 初始 位置 乙個2進製矩陣 0 表示空 1 表示有障礙物 找到到達 終點 的最短路線,返回路線的長度。如果騎士不能到達則返回 1 如果騎士的位置為 x,y 他下一步可以到達以下這些位置 x 1,y 2 x 1,y 2 x 1,y 2 x 1,y 2 x 2,y 1 x 2,y 1...
迷宮的最短路線(BFS
迷宮的最短路線 bfs 題目 給定乙個大小為n m的迷宮。迷宮由通道和牆壁足證,每一步可以向鄰接的上下左右四格的通道移動。請求出從起點到終點所需要的最小步數。請注意,本體假定從起點一定可以移動到終點。限制條件 n,m 100 思路 1.初始化迷宮maze i j 並對其每乙個位置附上乙個很大的值來表...
送快遞的最短路線
題目描述 某物流派送員p,需要給a b c d4個快遞點派送包裹,請問派送員需要選擇什麼的路線,才能完成最短路程的派送。假設如圖派送員的起點座標 0,0 派送路線只能沿著圖中的方格邊行駛,每個小格都是正方形,且邊長為1,如p到d的距離就是4。隨機輸入n個派送點座標,求輸出最短派送路線值 從起點開始完...