Skip to content

Commit bc7a0bb

Browse files
authored
feat: add solutions to lc problem: No.2257 (doocs#3798)
1 parent 83d6171 commit bc7a0bb

File tree

5 files changed

+308
-0
lines changed

5 files changed

+308
-0
lines changed

Diff for: solution/2200-2299/2257.Count Unguarded Cells in the Grid/README.md

+111
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,117 @@ function countUnguarded(m: number, n: number, guards: number[][], walls: number[
246246
}
247247
```
248248

249+
#### JavaScript
250+
251+
```js
252+
function countUnguarded(m, n, guards, walls) {
253+
const g = Array.from({ length: m }, () => Array.from({ length: n }, () => 0));
254+
for (const [i, j] of guards) {
255+
g[i][j] = 2;
256+
}
257+
for (const [i, j] of walls) {
258+
g[i][j] = 2;
259+
}
260+
const dirs = [-1, 0, 1, 0, -1];
261+
for (const [i, j] of guards) {
262+
for (let k = 0; k < 4; ++k) {
263+
let [x, y] = [i, j];
264+
let [a, b] = [dirs[k], dirs[k + 1]];
265+
while (x + a >= 0 && x + a < m && y + b >= 0 && y + b < n && g[x + a][y + b] < 2) {
266+
x += a;
267+
y += b;
268+
g[x][y] = 1;
269+
}
270+
}
271+
}
272+
let ans = 0;
273+
for (const row of g) {
274+
for (const v of row) {
275+
ans += v === 0 ? 1 : 0;
276+
}
277+
}
278+
return ans;
279+
}
280+
```
281+
282+
<!-- tabs:end -->
283+
284+
<!-- solution:end -->
285+
286+
<!-- solution:start -->
287+
288+
### 方法二:DFS + 模拟
289+
290+
<!-- tabs:start -->
291+
292+
#### TypeScript
293+
294+
```ts
295+
function countUnguarded(m: number, n: number, guards: number[][], walls: number[][]): number {
296+
let c = 0;
297+
const mtx = Array.from({ length: m }, () => Array(n).fill(0));
298+
for (const [i, j] of guards) mtx[i][j] = 2;
299+
for (const [i, j] of walls) mtx[i][j] = 2;
300+
301+
const dfs = (i: number, j: number, dx: number, dy: number) => {
302+
[i, j] = [i + dx, j + dy];
303+
304+
if (i < 0 || m <= i || j < 0 || n <= j || mtx[i][j] === 2) return;
305+
306+
if (mtx[i][j] === 0) {
307+
mtx[i][j] = 1;
308+
c++;
309+
}
310+
311+
dfs(i, j, dx, dy);
312+
};
313+
314+
const DIRS = [-1, 0, 1, 0, -1];
315+
for (const [i, j] of guards) {
316+
for (let k = 0; k < 4; k++) {
317+
const [dx, dy] = [DIRS[k], DIRS[k + 1]];
318+
dfs(i, j, dx, dy);
319+
}
320+
}
321+
322+
return m * n - guards.length - walls.length - c;
323+
}
324+
```
325+
326+
#### JavaScript
327+
328+
```js
329+
function countUnguarded(m, n, guards, walls) {
330+
let c = 0;
331+
const mtx = Array.from({ length: m }, () => Array(n).fill(0));
332+
for (const [i, j] of guards) mtx[i][j] = 2;
333+
for (const [i, j] of walls) mtx[i][j] = 2;
334+
335+
const dfs = (i, j, dx, dy) => {
336+
[i, j] = [i + dx, j + dy];
337+
338+
if (i < 0 || m <= i || j < 0 || n <= j || mtx[i][j] === 2) return;
339+
340+
if (mtx[i][j] === 0) {
341+
mtx[i][j] = 1;
342+
c++;
343+
}
344+
345+
dfs(i, j, dx, dy);
346+
};
347+
348+
const DIRS = [-1, 0, 1, 0, -1];
349+
for (const [i, j] of guards) {
350+
for (let k = 0; k < 4; k++) {
351+
const [dx, dy] = [DIRS[k], DIRS[k + 1]];
352+
dfs(i, j, dx, dy);
353+
}
354+
}
355+
356+
return m * n - guards.length - walls.length - c;
357+
}
358+
```
359+
249360
<!-- tabs:end -->
250361

251362
<!-- solution:end -->

Diff for: solution/2200-2299/2257.Count Unguarded Cells in the Grid/README_EN.md

+111
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,117 @@ function countUnguarded(m: number, n: number, guards: number[][], walls: number[
242242
}
243243
```
244244

245+
#### JavaScript
246+
247+
```js
248+
function countUnguarded(m, n, guards, walls) {
249+
const g = Array.from({ length: m }, () => Array.from({ length: n }, () => 0));
250+
for (const [i, j] of guards) {
251+
g[i][j] = 2;
252+
}
253+
for (const [i, j] of walls) {
254+
g[i][j] = 2;
255+
}
256+
const dirs = [-1, 0, 1, 0, -1];
257+
for (const [i, j] of guards) {
258+
for (let k = 0; k < 4; ++k) {
259+
let [x, y] = [i, j];
260+
let [a, b] = [dirs[k], dirs[k + 1]];
261+
while (x + a >= 0 && x + a < m && y + b >= 0 && y + b < n && g[x + a][y + b] < 2) {
262+
x += a;
263+
y += b;
264+
g[x][y] = 1;
265+
}
266+
}
267+
}
268+
let ans = 0;
269+
for (const row of g) {
270+
for (const v of row) {
271+
ans += v === 0 ? 1 : 0;
272+
}
273+
}
274+
return ans;
275+
}
276+
```
277+
278+
<!-- tabs:end -->
279+
280+
<!-- solution:end -->
281+
282+
<!-- solution:start -->
283+
284+
### Solution 2: DFS + Simulation
285+
286+
<!-- tabs:start -->
287+
288+
#### TypeScript
289+
290+
```ts
291+
function countUnguarded(m: number, n: number, guards: number[][], walls: number[][]): number {
292+
let c = 0;
293+
const mtx = Array.from({ length: m }, () => Array(n).fill(0));
294+
for (const [i, j] of guards) mtx[i][j] = 2;
295+
for (const [i, j] of walls) mtx[i][j] = 2;
296+
297+
const dfs = (i: number, j: number, dx: number, dy: number) => {
298+
[i, j] = [i + dx, j + dy];
299+
300+
if (i < 0 || m <= i || j < 0 || n <= j || mtx[i][j] === 2) return;
301+
302+
if (mtx[i][j] === 0) {
303+
mtx[i][j] = 1;
304+
c++;
305+
}
306+
307+
dfs(i, j, dx, dy);
308+
};
309+
310+
const DIRS = [-1, 0, 1, 0, -1];
311+
for (const [i, j] of guards) {
312+
for (let k = 0; k < 4; k++) {
313+
const [dx, dy] = [DIRS[k], DIRS[k + 1]];
314+
dfs(i, j, dx, dy);
315+
}
316+
}
317+
318+
return m * n - guards.length - walls.length - c;
319+
}
320+
```
321+
322+
#### JavaScript
323+
324+
```js
325+
function countUnguarded(m, n, guards, walls) {
326+
let c = 0;
327+
const mtx = Array.from({ length: m }, () => Array(n).fill(0));
328+
for (const [i, j] of guards) mtx[i][j] = 2;
329+
for (const [i, j] of walls) mtx[i][j] = 2;
330+
331+
const dfs = (i, j, dx, dy) => {
332+
[i, j] = [i + dx, j + dy];
333+
334+
if (i < 0 || m <= i || j < 0 || n <= j || mtx[i][j] === 2) return;
335+
336+
if (mtx[i][j] === 0) {
337+
mtx[i][j] = 1;
338+
c++;
339+
}
340+
341+
dfs(i, j, dx, dy);
342+
};
343+
344+
const DIRS = [-1, 0, 1, 0, -1];
345+
for (const [i, j] of guards) {
346+
for (let k = 0; k < 4; k++) {
347+
const [dx, dy] = [DIRS[k], DIRS[k + 1]];
348+
dfs(i, j, dx, dy);
349+
}
350+
}
351+
352+
return m * n - guards.length - walls.length - c;
353+
}
354+
```
355+
245356
<!-- tabs:end -->
246357

247358
<!-- solution:end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
function countUnguarded(m, n, guards, walls) {
2+
const g = Array.from({ length: m }, () => Array.from({ length: n }, () => 0));
3+
for (const [i, j] of guards) {
4+
g[i][j] = 2;
5+
}
6+
for (const [i, j] of walls) {
7+
g[i][j] = 2;
8+
}
9+
const dirs = [-1, 0, 1, 0, -1];
10+
for (const [i, j] of guards) {
11+
for (let k = 0; k < 4; ++k) {
12+
let [x, y] = [i, j];
13+
let [a, b] = [dirs[k], dirs[k + 1]];
14+
while (x + a >= 0 && x + a < m && y + b >= 0 && y + b < n && g[x + a][y + b] < 2) {
15+
x += a;
16+
y += b;
17+
g[x][y] = 1;
18+
}
19+
}
20+
}
21+
let ans = 0;
22+
for (const row of g) {
23+
for (const v of row) {
24+
ans += v === 0 ? 1 : 0;
25+
}
26+
}
27+
return ans;
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
function countUnguarded(m, n, guards, walls) {
2+
let c = 0;
3+
const mtx = Array.from({ length: m }, () => Array(n).fill(0));
4+
for (const [i, j] of guards) mtx[i][j] = 2;
5+
for (const [i, j] of walls) mtx[i][j] = 2;
6+
7+
const dfs = (i, j, dx, dy) => {
8+
[i, j] = [i + dx, j + dy];
9+
10+
if (i < 0 || m <= i || j < 0 || n <= j || mtx[i][j] === 2) return;
11+
12+
if (mtx[i][j] === 0) {
13+
mtx[i][j] = 1;
14+
c++;
15+
}
16+
17+
dfs(i, j, dx, dy);
18+
};
19+
20+
const DIRS = [-1, 0, 1, 0, -1];
21+
for (const [i, j] of guards) {
22+
for (let k = 0; k < 4; k++) {
23+
const [dx, dy] = [DIRS[k], DIRS[k + 1]];
24+
dfs(i, j, dx, dy);
25+
}
26+
}
27+
28+
return m * n - guards.length - walls.length - c;
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
function countUnguarded(m: number, n: number, guards: number[][], walls: number[][]): number {
2+
let c = 0;
3+
const mtx = Array.from({ length: m }, () => Array(n).fill(0));
4+
for (const [i, j] of guards) mtx[i][j] = 2;
5+
for (const [i, j] of walls) mtx[i][j] = 2;
6+
7+
const dfs = (i: number, j: number, dx: number, dy: number) => {
8+
[i, j] = [i + dx, j + dy];
9+
10+
if (i < 0 || m <= i || j < 0 || n <= j || mtx[i][j] === 2) return;
11+
12+
if (mtx[i][j] === 0) {
13+
mtx[i][j] = 1;
14+
c++;
15+
}
16+
17+
dfs(i, j, dx, dy);
18+
};
19+
20+
const DIRS = [-1, 0, 1, 0, -1];
21+
for (const [i, j] of guards) {
22+
for (let k = 0; k < 4; k++) {
23+
const [dx, dy] = [DIRS[k], DIRS[k + 1]];
24+
dfs(i, j, dx, dy);
25+
}
26+
}
27+
28+
return m * n - guards.length - walls.length - c;
29+
}

0 commit comments

Comments
 (0)