sponsored links

劍指Offer(六十六):機器人的運動範圍(Java版)

描述

地上有一個 rows 行和 cols 列的方格。座標從 [0,0] 到 [rows-1,cols-1] 。一個機器人從座標 [0,0] 的格子開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數位之和大於 threshold 的格子。 例如,當 threshold 為 18 時,機器人能夠進入方格 [35,37] ,因為 3+5+3+7 = 18。但是,它不能進入方格 [35,38] ,因為 3+5+3+8 = 19 。請問該機器人能夠達到多少個格子?

資料範圍: 0 \le threshold \le 15 \0≤threshold≤15 ,1 \le rows,cols \le 100 \1≤rows,cols≤100進階:空間複雜度 O(nm) \O(nm) ,時間複雜度 O(nm) \O(nm)

示例1

輸入:1,2,3

返回值:3

示例2

輸入:0,1,3

返回值:1

示例3

輸入:10,1,100

返回值:29

說明:

[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11],[0,12],[0,13],[0,14],[0,15],[0,16],[0,17],[0,18],[0,19],[0,20],[0,21],[0,22],[0,23],[0,24],[0,25],[0,26],[0,27],[0,28] 這29種,後面的[0,29],[0,30]以及[0,31]等等是無法到達的

示例4

輸入:5,10,10

返回值:21

第一種解法

使用dfs(深度優先搜尋)來解決,需要注意的一點。得防止重複的點二次計數。程式碼如下

int[][] arr = null;
int count = 0;
public int firstMovingCount(int threshold, int rows, int cols) {
    if(rows < 1 && cols < 1){
        return count;
    }
    if(threshold < 0){
        return count;
    }
    arr = new int[rows][cols];
    dsf(threshold,rows,cols,0,0);
    return count;
}

public void dsf(int threshold, int rows, int cols,int row,int col){
    if(row < 0 || row >= rows || col < 0 || col >= cols || arr[row][col] == 1){
        return;
    }
    if(check(row) + check(col) > threshold){
        return;
    }
    arr[row][col] = 1;
    count++;
    dsf(threshold,rows,cols,row+1,col);
    dsf(threshold,rows,cols,row-1,col);
    dsf(threshold,rows,cols,row,col+1);
    dsf(threshold,rows,cols,row,col-1);
}

int check(int num){
    int sum = 0;
    while (num > 0){
        sum += (num % 10);
        num = num /10;
    }
    return sum;
}

第二種解法

使用bfs(廣度優先搜尋)來解決。對於bfs的特性,採用佇列來實現是最好的,因為佇列是先進先出,離他最近的訪問完之後加入到佇列中,最先入隊的也是最先出隊的,程式碼如下

int[][] arr = null;
int count = 0;

int check(int num){
    int sum = 0;
    while (num > 0){
        sum += (num % 10);
        num = num /10;
    }
    return sum;
}

public int secondMovingCount(int threshold, int rows, int cols) {
    if(rows < 1 && cols < 1){
        return count;
    }
    if(threshold < 0){
        return count;
    }
    arr = new int[rows][cols];
    Queue<int[]> queue = new LinkedList<>();
    queue.add(new int[]{0,0});
    while (!queue.isEmpty()){
        int[] poll = queue.poll();
        int i = poll[0];
        int j = poll[1];
        if(i >= rows || j >= cols || arr[i][j] == 1 || (check(i) + check(j) > threshold)){
            continue;
        }
        arr[i][j] = 1;
        count++;
        queue.add(new int[]{i+1,j});
        queue.add(new int[]{i,j+1});
    }
    return count;
}
分類: 數碼
時間: 2022-02-20

相關文章

電腦開機出現藍色畫面的問題解決方法
有時候電腦開機會出現藍色畫面,怎麼辦呢?下面告訴你方法: 1.用防毒軟體檢視電腦是否中病毒,清理一下電腦系統垃圾,系統垃圾過多也會導致電腦執行不暢甚至藍色畫面重啟. 2.排查電腦系統是否損壞,重灌系統 ...

電腦開機速度慢?別讓這三個原因拖慢你的電腦

電腦開機速度慢?別讓這三個原因拖慢你的電腦
我們使用win10系統時間長了之後會發現win10開機速度變慢,但是這樣會影響我們的工作效率,那麼怎麼提升win10開機速度呢? 很多使用者朋友並沒有很好解決win10開機速度變慢的方法,下面維度IT ...

電腦開機出現Exiting Intel PXE ROM的處理方法
近日,筆者的聯想膝上型電腦出現了故障, 開機就顯示Exiting Intel PXE ROM,進不了系統,筆者透過排查詢到了解決問題的方法,特分享給大家,不足之處請大家指導. 首先是找準出現這個問題的 ...

Win10刪除開機密碼的小技巧

Win10刪除開機密碼的小技巧
Win10刪除開機密碼的小技巧,電腦刪除開機密碼的方法,電腦開機密碼可以保護我們的隱私安全,但取消就有點複雜了,最近許多小夥伴反映找不到刪除開機密碼的入口,難道設定了密碼就不能刪除嗎?小編為大家帶來了 ...

電腦每次開機都要自檢怎麼辦?為什麼每次開機都要自檢?

電腦每次開機都要自檢怎麼辦?為什麼每次開機都要自檢?
原來電腦很好,但是最近每次開機,都會出現磁碟自檢,而且要等很長時間,很煩人,為什麼每次開機都要自檢?電腦每次開機時是如何自我檢查的?下面小編為您介紹一下其原因和解決方案,希望對您有所幫助! 磁碟自我檢 ...

如何破解電腦系統登入密碼,和一開機就要密碼的COMS密碼

如何破解電腦系統登入密碼,和一開機就要密碼的COMS密碼
如何破解電腦系統登入密碼,和一開機就要密碼的COMS密碼 電腦開機密碼分為兩種,一種是進到系統,登入使用者時,需要輸入的密碼,這是使用者密碼,也是系統登入密碼,這種密碼最常見.另一種是,一開機就要密碼 ...

花費百元買一個智慧插排,就能實現對公司電腦的遠端開機和控制

花費百元買一個智慧插排,就能實現對公司電腦的遠端開機和控制
一.前言,我為什麼要遠端開機 需要遠端開機+遠端操作的場景還是比較多的,比如: 1:我在某外企工作,鑑於公司的保密制度,員工統一使用IBM lotus notes部署的企業郵箱,這個郵箱只能裝在公司電 ...

2006年,韓國女生聚餐後失蹤,電腦記錄遭刪除,焚燒物多出70公斤

2006年,韓國女生聚餐後失蹤,電腦記錄遭刪除,焚燒物多出70公斤
2006年,韓國一位29歲的女大學生李允熙在和同學.老師聚餐之後離奇失蹤,此事引起了韓國全民關注,當警察調查案發現場,尋求事情真相時,李允熙的兩名同學卻犯下了致命錯誤,以至於疑點重重,在當時引起了廣泛 ...

教你如何一步一步破解電腦的開機密碼

教你如何一步一步破解電腦的開機密碼
生活中要記住的東西很多,但總有一些不常用的會被遺忘,就比如這臺電腦密碼 所以鑰匙串上常備一個隨身碟啟動盤是多麼重要 把隨身碟啟動盤接入電腦USB口 電腦開機按Delete進Bios(毎臺電腦型號不同進 ...

膝上型電腦開機後螢幕不亮怎麼辦

膝上型電腦開機後螢幕不亮怎麼辦
膝上型電腦改變了工作場所的限制,大大提高了工作效率,在使用膝上型電腦時,你經常會遇到開機後螢幕不亮.黑屏的情況嗎?如果膝上型電腦開機後螢幕沒有亮怎麼辦 一.如果我的膝上型電腦不亮怎麼辦 1. 開機後膝 ...

電腦黑屏的問題?

電腦黑屏的問題?
開機後,主機執行正常,但顯示器黑屏無法顯示.這類故障首先檢測下主機與顯示器的VGA線是否連線正常,顯示器電源供電是否正常.沒有問題的話,就用螺絲刀開啟主機箱蓋,把記憶體條拔下來,用橡皮擦拭金手指區域並 ...

電腦整機升級不僅是換顯示卡,這些硬體也要升級

電腦整機升級不僅是換顯示卡,這些硬體也要升級
電腦升級最簡單的方法是什麼?答案自然是更換顯示卡!但是你知道嗎要想整機的效能提升,除了升級顯示卡以外,你還需要升級電腦的其他硬體.不過由於顯示卡更換起來比較方便,升級顯示卡對於小白使用者來說自然十分友 ...

終於不卡了!原來華為手機可以這樣清理!6個實用技巧一下清幾個G

終於不卡了!原來華為手機可以這樣清理!6個實用技巧一下清幾個G
日常使用華為手機拍照.看影片.聽音樂等都會給手機產生很多的快取檔案,這也是安卓系統的一個通病.在日積月累的使用中,如果長時間沒有清理垃圾的話,手機就會變的越來越卡,記憶體也會被佔用的越來越多,導致記憶 ...

手把手教你,如何解鎖 戴爾G15 RTX 3060 130W功率+獨顯直連

手把手教你,如何解鎖 戴爾G15 RTX 3060 130W功率+獨顯直連
前言 2021年選一款遊戲本有兩點非常重要:一個是看顯示卡的功耗.另一個是看有沒有獨顯直連.因為這兩點會直接影響筆記本效能,尤其是遊戲效能.在7月份的時候,曾經給表弟推薦了戴爾 DELL 遊匣 G15 ...

奇駿防側滑燈亮怎麼解決?

奇駿防側滑燈亮怎麼解決?
車主在使用的過程中發現防側滑燈亮起來的話,有以下的幾個原因: 故障1:手動關閉車身穩定系統. 解決方法:預設是開啟防側滑車身穩定系統的,但是如果你不小心按到了方向盤左下方的這個車身穩定系統的按鍵,那就 ...

Win 10更新後變卡,一招教你關閉自動更新,還不來看看?

Win 10更新後變卡,一招教你關閉自動更新,還不來看看?
Windows10系統使用者經常會收到更新提醒,這種更新到底有沒有必要呢?更新要根據自身使用習慣.電腦的配置.系統相容問題等綜合考慮,不然就容易出現問題.一般來說幾年前的電腦或配置低的電腦,不建議更新 ...

幾個難忘的中秋節片段

幾個難忘的中秋節片段
年節好過.這是人們常說的一句話,細想想,也確實如此.曾寫文章回憶了留在記憶中的幾個難忘的春節,在這個細雨中的中秋之晨,睡不著,寫寫幾個難忘的中秋節片段吧. 2000年9月12日是中秋節,那時我已是入伍 ...

小米平板秒變PC,向日葵智慧插座體驗

小米平板秒變PC,向日葵智慧插座體驗
不知道各位有沒有遇到下班回家突然需要檢視工作檔案的情況,事發突然的話,要麼自己回公司,要麼把事情延後,總是非常的麻煩,如果可以遠端操作.檢視.編輯公司電腦裡面的檔案,那是不是方便多了! 最近我就上手了 ...

最強直播攝像頭 - Elgato FaceCam

最強直播攝像頭 - Elgato FaceCam
大家好,我是波導終結者. 微博上看到這個預告影片,我一時沒反應過來是什麼新品.難道Elgato要出吹泡泡機了嗎?那敢情好,我兒子肯定很喜歡.現在新品已經公佈,原來是最新款的攝像頭,那8個不是泡泡,而是 ...

雲殼mac如何解除安裝
離職後交接完工作,又不想重灌系統.這裡重點說一下蘋果電腦,mac的解除安裝方法. 1. 開啟 Mac 上的 Finder 應用,點選應用程式,找到自己想要解除安裝雲殼圖示,右鍵點選應用,拖拽到右下角廢 ...