日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[剑指offer][JAVA][面试题第13题][机器人的运动][DFS][BFS]

發布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [剑指offer][JAVA][面试题第13题][机器人的运动][DFS][BFS] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】 [中等]

地上有一個m行n列的方格,從坐標 [0,0] 到坐標 [m-1,n-1] 。一個機器人從坐標 [0, 0] 的格子開始移動,它每次可以向左、右、上、下移動一格(不能移動到方格外),也不能進入行坐標和列坐標的數位之和大于k的格子。例如,當k為18時,機器人能夠進入方格 [35, 37] ,因為3+5+3+7=18。但它不能進入方格 [35, 38],因為3+5+3+8=19。請問該機器人能夠到達多少個格子?示例 1: 輸入:m = 2, n = 3, k = 1 輸出:3 示例 1:輸入:m = 3, n = 1, k = 0 輸出:1 提示: 1 <= n,m <= 100 0 <= k <= 20

【解答思路】

題目分析:題意是一個人從(0,0)開始向走,可以走四個方向,它下一個走到的地方的坐標數位之和不超過k,問這個人最多可以走多少個格子

1. DFS
  • 從起點開始用深搜的方式遍歷矩陣 只向下或者向右
  • 控制深搜邊界的同時判斷當前訪問的位置數位和是否小于等于k
  • 需要一個標記數組記錄每個位置的訪問情況,防止重復計算
    時間復雜度:O(N^2) 空間復雜度:O(N)
class Solution {int m,n,k; public int movingCount(int m, int n, int k) {this.m=m;this.n=n;this.k=k;//標記訪問過的位置boolean[][] visited=new boolean[m][n];return dfs(0,0,0,visited); }/*** 深搜* @param i 橫坐標* @param j 縱坐標* @param sum 坐標數位和* @param visited 標記數組* @return*/ private int dfs(int i, int j, int sum, boolean[][] visited) {//如果 坐標越界 或者 數位和大于k 或者 已經訪問過,則停止當前方向的深搜if (i==m||j==n||sum>k||visited[i][j])return 0;//標記為已訪問visited[i][j]=true;//向下或者向右深搜return 1+dfs(i+1,j,sums(i+1,j),visited)+dfs(i,j+1,sums(i,j+1),visited); }//計算數位和 public int sums(int x,int y){int ans=0;while (x != 0) {ans+=x%10;x/=10;}while (y != 0) {ans+=y%10;y/=10;}return ans; }}
2. BFS(隊列)
  • 從起點開始用深搜的方式遍歷矩陣 只向下或者向右
  • 控制深搜邊界的同時判斷當前訪問的位置數位和是否小于等于k
  • 需要一個標記數組記錄每個位置的訪問情況,防止重復計算
    時間復雜度:O(N) 空間復雜度:O(N)
//時間復雜度:O(mn) public int movingCount(int m, int n, int k) {//隊列保存坐標Queue<int[]> queue=new ArrayDeque<>();//標記數組boolean[][] visited=new boolean[m][n];//廣搜queue.add(new int[]{0,0});int count=0;visited[0][0]=true;while (!queue.isEmpty()) {int[] poll = queue.poll();count++;//向下、向右尋找符合要求的位置入隊并標記訪問狀態//不越界 并且 數位和小于等于k 并且 未訪問過if (poll[0] + 1 < m&& sums(poll[0] + 1, poll[1]) <= k&&!visited[poll[0]+1][poll[1]]){queue.add(new int[]{poll[0]+1,poll[1]});visited[poll[0]+1][poll[1]]=true;}if (poll[1] + 1 < n&& sums(poll[0], poll[1] + 1) <= k&&!visited[poll[0]][poll[1] + 1]){queue.add(new int[]{poll[0],poll[1]+1});visited[poll[0]][poll[1]+1]=true;}}return count; } //計算數位和 public int sums(int x,int y){int ans=0;while (x != 0) {ans+=x%10;x/=10;}while (y != 0) {ans+=y%10;y/=10;}return ans; }

【總結】

1. BFS
  • 確定遞歸參數
  • 終止條件
  • 標記數組記錄每個位置的訪問情況
  • 計數在遞歸回溯中 (同廣度)
2. DFS
  • 隊列 (出隊后搜索符合條件入隊)
  • 終止條件
  • 標記數組記錄每個位置的訪問情況
  • 計數在所有相同深度出完隊列之后
3. BFS DFS 分步思考 效果佳
4.100以內數之和

總結

以上是生活随笔為你收集整理的[剑指offer][JAVA][面试题第13题][机器人的运动][DFS][BFS]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。