劍指 Offer 13 機械人的運動範圍

2021-10-22 17:35:17 字數 2488 閱讀 9646

最近想將劍指 offer 13 重新刷一遍,因為之間是在leetcode上面做的題目,現在在牛客上面,我發現有些邊界條件牛客沒給出,但是面試基本手撕**都是在牛客上面。

題目:

牛客:劍指 offer 13. 機械人的運動範圍

leetcode:劍指 offer 13. 機械人的運動範圍

思路:

首先我們做這種題目是需要有一些必須寫出的函式。邊界函式isarea() 還有個記錄是否訪問的二維陣列used以及方向增量陣列dxy

bool

isarea

(int rows,

int cols,

int temp_i,

int temp_j)

記錄是否訪問過的二維陣列used

vector

bool

>>

used

(rows,vector<

bool

>

(cols,

false))

;

方向增量陣列

vector

int>> dxy,,,};

現在開始分析題意,題目要求是可到達的位置數目,也就是說明重複走過的格仔不用再走了,顯然是flood fill的意思(used每次訪問設定true,在往回走時不用恢復為false)

這題題目說不能進入行座標和列座標的數字之和大於k的格仔

需要乙個函式getlegal

int

getlegal

(int temp_i,

int temp_j,

int threshold)

while

(temp_j!=0)

return threshold>=sum;

}

方法一:

萬能的dfs ,我們在dfs中注意used設定為true就不用再恢復了

方法二:廣度優先遍歷bfs

我們需要注意佇列中存的是pairnode,相關的值是node.first,node.second.

class

solution,,

,};bool

isarea

(int rows,

int cols,

int temp_i,

int temp_j)

intgetlegal

(int temp_i,

int temp_j,

int threshold)

while

(temp_j!=0)

return threshold>=sum;

}void

dfs(

int rows,

int cols,

int current_i,

int current_j, vector

bool

>>

&used,

int threshold )}}

public

:int

movingcount

(int threshold,

int rows,

int cols)

}return count;}}

;

方法二: 使用佇列進行廣度優先遍歷

class

solution,,

,};bool

isarea

(int rows,

int cols,

int temp_i,

int temp_j)

intgetlegal

(int temp_i,

int temp_j,

int threshold)

while

(temp_j!=0)

return threshold>=sum;

}void

dfs(

int rows,

int cols,

int current_i,

int current_j, vector

bool

>>

&used,

int threshold )}}

public

:int

movingcount

(int threshold,

int rows,

int cols));

int count=0;

while

(!qu.

empty()

)); used[temp_i]

[temp_j]

=true;}

}}}return count;}}

;

劍指offer13機械人的運動範圍

地上有乙個m行n列的方格,從座標 0,0 到座標 m 1,n 1 乙個機械人從座標 0,0 的格仔開始移動,它每次可以向左 右 上 下移動一格 不能移動到方格外 也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但它不能進入...

劍指 Offer 13 機械人的運動範圍

題目描述 地上有乙個m行n列的方格,從座標 0,0 到座標 m 1,n 1 乙個機械人從座標 0,0 的格仔開始移動,它每次可以向左 右 上 下移動一格 不能移動到方格外 也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但...

劍指 Offer 13 機械人的運動範圍

地上有乙個m行n列的方格,從座標 0,0 到座標 m 1,n 1 乙個機械人從座標 0,0 的格仔開始移動,它每次可以向左 右 上 下移動一格 不能移動到方格外 也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但它不能進入...