劍指 Offer 13. 機器人的運動範圍(1/33)
阿新 • • 發佈:2022-03-27
一、題目
二、題目分析
1.看到這個題目“上,下,左,右" 就聯想到 bfs 或 dfs 去解決問題
2.本題中有四個我們要進行解決的問題:(1)位數和計算 (2)四周方向的遍歷 (3)限制的條件 (4)格子數的統計
(1)位數和的計算:解決方法:轉換成字串,講數值劃分成由位陣列成的陣列,然後累加每個數的值 或者 利用數學公式來解決:利用取餘累加;
(2)四周方向的遍歷:解決方法:利用方位陣列來解決,這裡需要注意的一點是:方位陣列和我們學的x軸y軸不一樣,是根據行列的增減來決定方向
(3)限制的條件:解決方法:第一個邊界的限制,第二個下一個移動方向不能大於k,第三個當前位置是否走過
(4)格子數的統計:解決方法:我們可以利用 set 資料結構來解決 (3)中的第三個問題,然後set可以進行統計,然後輸出set.size來計算有多少長度(格子數)
三、程式碼
/** * @param {number} m * @param {number} n * @param {number} k * @return {number} */ var movingCount = function(m, n, k) { //位數和的計算 function getsum(num){ let answer = 0; while(num){ answer+= num %10; num = Math.floor(num/10); } return answer; } //方向陣列 const directionArry = [ [-1,0],//向上 [0,1],//向右 [1,0],//向下 [0,-1]//向左 ]; //定義set let set = new Set(['0,0']); //從頭開始 let queue = [[0,0]]; //遍歷佇列中的座標 while(queue.length){ //移除佇列的首座標 let [x,y] = queue.shift(); //遍歷方向 for(let i =0; i<4; i++){ let setX = x + directionArry[i][0]; let setY = y + directionArry[i][1]; if( setX < 0 || setX >=m || setY < 0 || setY >=n || getsum(setX) + getsum(setY) > k || set.has(`${setX},${setY}`) ){ continue; } set.add(`${setX},${setY}`); queue.push([setX,setY]); } } return set.size; };