運動LeetCode 46ロボットの範囲

タイトル説明

接地は、m行n列、座標の座標[0,0] [M-1、N-1]を市松。グリッドの座標からロボット[0、0]に移動し始め、それがそれぞれ左、右、上及びグリッドの移動ダウン(例外側に移動しない)、和の行と列の座標を入力することができないできるビットの数よりも大きいです格子K。kが18である場合、例えば、ロボットが3 + 3 + 5 + 7 = 18は、[35、37]ボックスに入力することができます。それは3 + 3 + 5 + 8 = 19は、ボックス[35、38]を入力することはできません。ロボットは、格子の数に到達することができるだろうか?

 

例1:

入力:M = 2、N = 3 、K = 1
出力:3
例1:

入力:M = 3、N = 1 、K = 0
出力:1
注:

1 <= N、M <= 100
0 <= K <= 20

問題解決のためのアイデア

私は次のコードで、合計は座標kよりも大きいかどうかを確認するために、直接、配列を、トピックがあることを理解し始めました

 公共 INT movingCount(INT M、整数 nは、整数K){
         INT [] []グリッドは= 新しい INT [M] [N]。
        int型の結果= 0 ;
        以下のためにINT iは= 0; I <grid.length; I ++ ){
             ためINT J = 0; J <グリッド[I] .LENGTH; J ++ ){ 
                文字列numString = iは+ "" + J。
                CHAR []文字= numString.toCharArray()。
                int型の合計= 0 ;
                以下のためのint型L = 0。L <chars.length。L ++ ){ 
                    合計 + = Integer.valueOf(文字[L] + "" )。
                } 
                もし(合計<= K){ 
                    結果 ++ 
                } 
            } 
        } 
         戻り値の結果; 

        }
    

 

あなたも実行することはできません

だから、反応座標といくつかの場所でさえ少ないkよりも、だけでなく、ロボットの生活を困難にするためにカウントすることはできません

だから我々は、DFSアルゴリズムを使用しました

コードは以下の通りです

class Solution {
   boolean[][] visited;
     public int movingCount(int m, int n, int k) {
         visited = new boolean[m][n]; 
         return dfs(0, 0, m, n, k);
        

            }
     private int dfs(int x,int y,int m,int n,int k) {
          if (x>=m||y>=n||visited[x][y]||(x%10+x/10+y%10+y/10)>k) {
            return 0;
        }
          visited[x][y]=true;
          return 1+dfs(x+1, y, m, n, k)+dfs(x, y+1, m, n, k);
    }
}

 

おすすめ

転載: www.cnblogs.com/Transkai/p/12662065.html