タイトル説明
接地グリッドと、m行n列。グリッドからロボットが移動、右、左だけ毎回0,0座標上下四方セルが、グリッドの行および列の座標を入力することができないビットkの数の合計よりも大きいです。kが18である場合、例えば、ロボットが3 + 3 + 5 + 7 = 18から、ボックス(35、37)を入力することができます。3 + 3 + 5 + 8 = 19しかし、それは、ボックス(35、38)を入力することができません。ロボットは、格子の数に到達することができるだろうか?
問題解決のためのアイデア
动态规划 dp[i][j]表示是否可以到达,统计数字中
true
的个数,即为可以到达的格子数
コードは以下の通りです
公共 INT movingCount(INT閾値、INT行、INT colsの)
{
場合(閾値<0 )
戻り 0 ;
ブール [] [] DP = 新しい ブール [行+ 1] [COLS + 1 ]。
DP [ 0] [0] = 真。
以下のために(int型 I 1 =;私は=行を<; Iは++){ // 初始化
場合(DP [I-1] [0] && canreach(閾値、I、0 )){
DP [I] [ 0] = 真。
} 他 {
DP [I] [ 0] = 偽。
}
}
のために(int型 {; iが<= COLS I ++はI = 1)// 初始化
場合(DP [0] [I-1] && canreach(しきい値、0 、I)){
DP [ 0] [I] = 真;
} 他{
DP [ 0] [I] = 偽。
}
}
のために(int型、iは=行を<; I = 1 iは++ ){
ため(int型の J = 1; J <= COLS; J ++ ){
もし((DP [I-1]〜[J] && canreach(閾値、I、J))||(DP [I]、[J-1] && canreach(閾値、I、J))){
DP [I] [J ] = 真。
} 他{
DP [I] [j]は = 偽。
}
}
}
int型のカウント= 0 ;
以下のために(int型 I 0 =; iが行を<; Iは++ ){
ため(INT J = 0; J <COLS; J ++ ){
場合(DP [I] [J])
カウント ++ 。
}
}
戻り値の数。
}
パブリック ブール canreach(INTの閾値、int型のx、int型のY){
int型の和= 0 。
一方、(X> 0 ){
合計 10 + = X% 。
X / = 10 。
}
一方、(Y> 0 ){
合計 + = Y%10 。
Y / = 10 。
}
戻り値の和<= 閾値。
}