演算法記錄 騎士的最短路線

2021-10-17 14:37:24 字數 1904 閱讀 9030

給定騎士在棋盤上的 ​初始​ 位置(乙個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)

(x - 2, y + 1)

(x - 2, y - 1)

例1:

輸入:

[[0,0,0],

[0,0,0],

[0,0,0]]

source = [2, 0] destination = [2, 2]

輸出: 2

解釋:[2,0]->[0,1]->[2,2]

例2:

輸入:

[[0,1,0],

[0,0,1],

[0,0,0]]

source = [2, 0] destination = [2, 2]

輸出:-1

樸素​bfs​搜搜最短路,bfs概括來說就是像雷達一樣,一層一層進行尋找目標點。當找到目標點後進行回溯。從而找到最佳路徑。也就是說每走一步都要找到到達該點的最短的路徑,最終得到到達所有點的最短路徑,這題每一次的下一步做了規定,按照日字形跳到下一步。

根據下一跳位置建立方向陣列

​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個派送點座標,求輸出最短派送路線值 從起點開始完...