1. 程式人生 > 其它 >劍指 Offer 13. 機器人的運動範圍(1/33)

劍指 Offer 13. 機器人的運動範圍(1/33)

一、題目

 

二、題目分析

  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; };