35
35
36
36
** 流程** :
37
37
38
- 1 . ` (0,0) ` 开始。
39
- 2 . 根据公式判断 ` (i,j) ` 是否可进入:
40
- - 可进入,继续往右(` (i, j + 1) ` )往下(` (i + 1, j) ` )重新执行流程 2。
41
- - 不可进入,退出结算。
42
- 3 . 计算可进入方格的数量,返回即可。
38
+ 1 . ` (0,0) ` 开始。
39
+
40
+ 2 . 根据公式判断 ` (i, j) ` 是否可进入:
41
+
42
+ - 可进入,并继续往右 ` (i, j + 1) ` 往下 ` (i + 1, j) ` 重新执行流程 2。
43
+ - 不可进入,退出结算。
44
+
45
+ 3 . 计算可进入区域的数量,返回即可。
43
46
44
47
** 剪枝** :
45
48
46
49
对于已进入的方格,需要防止多次进入,否则会导致指数级耗时。
47
50
48
- 在确定方格可进入后,给方格加上标记。判断一个方格可进入性之前 ,先查看是否存在对应的标记,存在标记时及时退出。
51
+ 在确定方格可进入后,给方格加上标记。判断一个方格可进入之前 ,先查看是否存在对应的标记,存在标记时及时退出。
49
52
50
53
记录方式不限数组与哈希表。
51
54
@@ -171,20 +174,19 @@ public:
171
174
```ts
172
175
function movingCount(m: number, n: number, k: number): number {
173
176
const set = new Set();
174
- const dfs = (y: number, x: number) => {
175
- if (y === m || x === n || set.has(`${y},${x}`)) {
177
+ const dfs = (i: number, j: number) => {
178
+ const key = `${i},${j}`;
179
+ if (
180
+ i === m ||
181
+ j === n ||
182
+ set.has(key) ||
183
+ `${i}${j}`.split('').reduce((r, v) => r + Number(v), 0) > k
184
+ ) {
176
185
return;
177
186
}
178
- let count = 0;
179
- const str = `${y}${x}`;
180
- for (const c of str) {
181
- count += Number(c);
182
- }
183
- if (count <= k) {
184
- set.add(`${y},${x}`);
185
- dfs(y + 1, x);
186
- dfs(y, x + 1);
187
- }
187
+ set.add(key);
188
+ dfs(i + 1, j);
189
+ dfs(i, j + 1);
188
190
};
189
191
dfs(0, 0);
190
192
return set.size;
@@ -197,25 +199,26 @@ function movingCount(m: number, n: number, k: number): number {
197
199
198
200
``` rust
199
201
use std :: collections :: {HashSet , VecDeque };
200
-
201
202
impl Solution {
202
203
pub fn moving_count (m : i32 , n : i32 , k : i32 ) -> i32 {
203
- let mut deque = VecDeque :: new ();
204
204
let mut set = HashSet :: new ();
205
- deque . push_back ([ 0 , 0 ] );
206
- while let Some ([ y , x ]) = deque . pop_front () {
207
- if y < m && x < n && ! set . contains ( & format! ( " {},{} " , y , x ) ) {
208
- let str = format! (" {}{}" , y , x );
209
- let mut count = 0 ;
210
- for c in str . chars () {
211
- count += c . to_string () . parse :: < i32 >() . unwrap ();
212
- }
213
- if count <= k {
214
- set . insert ( format! ( " {},{} " , y , x ));
215
- deque . push_back ([ y + 1 , x ]);
216
- deque . push_back ([ y , x + 1 ]);
217
- }
205
+ let mut queue = VecDeque :: new ( );
206
+ queue . push_back ([ 0 , 0 ]);
207
+ while let Some ([ i , j ]) = queue . pop_front ( ) {
208
+ let key = format! (" {}, {}" , i , j );
209
+ if i == m
210
+ || j == n
211
+ || set . contains ( & key )
212
+ || k < format! ( " {}{} " , i , j )
213
+ . chars ()
214
+ . map ( | c | c . to_string () . parse :: < i32 >() . unwrap ())
215
+ . sum :: < i32 >()
216
+ {
217
+ continue ;
218
218
}
219
+ set . insert (key );
220
+ queue . push_back ([i + 1 , j ]);
221
+ queue . push_back ([i , j + 1 ]);
219
222
}
220
223
set . len () as i32
221
224
}
@@ -226,20 +229,21 @@ impl Solution {
226
229
227
230
``` rust
228
231
impl Solution {
229
- fn dfs (sign : & mut Vec <Vec <bool >>, k : usize , y : usize , x : usize ) -> i32 {
230
- if y == sign . len ()
231
- || x == sign [0 ]. len ()
232
- || sign [y ][ x ]
233
- || x % 10 + x / 10 % 10 + y % 10 + y / 10 % 10 > k
232
+ fn dfs (sign : & mut Vec <Vec <bool >>, k : usize , i : usize , j : usize ) -> i32 {
233
+ if i == sign . len ()
234
+ || j == sign [0 ]. len ()
235
+ || sign [i ][ j ]
236
+ || j % 10 + j / 10 % 10 + i % 10 + i / 10 % 10 > k
234
237
{
235
238
return 0 ;
236
239
}
237
- sign [y ][ x ] = true ;
238
- 1 + Solution :: dfs (sign , k , y + 1 , x ) + Solution :: dfs (sign , k , y , x + 1 )
240
+ sign [i ][ j ] = true ;
241
+ 1 + Self :: dfs (sign , k , i + 1 , j ) + Self :: dfs (sign , k , i , j + 1 )
239
242
}
243
+
240
244
pub fn moving_count (m : i32 , n : i32 , k : i32 ) -> i32 {
241
245
let mut sign = vec! [vec! [false ; n as usize ]; m as usize ];
242
- Solution :: dfs (& mut sign , k as usize , 0 , 0 )
246
+ Self :: dfs (& mut sign , k as usize , 0 , 0 )
243
247
}
244
248
}
245
249
```
0 commit comments