# 抗洪救灾[200分]
# 题目内容
某地区发生特大洪水,水位高达 $X$,该地区被划分成了 $m \times n$ 个区块,各区块海拔高度不同。
被洪水淹没区域的群众已经自发转移到附近的高地,消防官兵需要快速获取未被淹没的高地数量,并派出救援队将群众转移。请你快速帮助消防官兵统计出未被淹没的高地数量,方便消防官兵组织救援。
未淹没的连续区块被识别为同一区域,连续方式包含水平、垂直、斜线方向(8 连通)。
# 输入描述
- 参数 1:整数 $X$,表示洪水高度($0 \le X \le 10$)。
- 参数 2:整数 $m$,表示区块的行数($3 \le m,n \le 100$)。
- 参数 3:整数 $n$,表示区块的列数($3 \le m,n \le 100$)。
- 参数 4:二维数组($m \times n$),表示每个区块的海拔高度。
# 输出描述
一个整数,表示未被淹没的高地区域数量。
# 样例
# 样例 1
输入
5 3 3
0 0 0
0 9 0
0 0 0
1
2
3
4
2
3
4
输出
1
1
说明: 只有一个区块高度(9),大于洪水高度(5),因此返回 1!
# 样例 2
输入
3 5 5
2 2 2 2 2
2 9 9 9 2
2 9 9 9 2
2 9 9 9 2
2 2 2 2 2
1
2
3
4
5
6
2
3
4
5
6
输出
1
1
说明: 如下矩阵,只有一个中间连续区块高度(9)大于洪水高度 5,因此返回 1。
22222
29992
29992
29992
22222
1
2
3
4
5
2
3
4
5
# 代码
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let inputs = [];
rl.on('line', (input) => {
inputs.push(input.split(' ').map(Number));
})
rl.on('close', () => {
const one = inputs.shift();
const x = one[0];
const m = one[1];
const n = one[2];
const arr = inputs;
const temp = [[1, 0], [-1, 0], [0, 1], [0, -1], [1, 1], [1, -1], [-1, 1], [-1, -1]];
let ans = 0;
let used = Array.from({length: m}, () => Array.from({length: n}, () => false));
const dfs =(i, j) => {
used[i][j] = true;
for(let k=0; k<temp.length; k++) {
const nx = i + temp[k][0];
const ny = j + temp[k][1];
if (nx >=0 && nx < m && ny >= 0 && ny < n && !used[nx][ny] && arr[nx][ny] > x) {
dfs(nx, ny);
}
}
}
for(let i=0;i<m;i++) {
for(let j=0;j<n;j++) {
if (arr[i][j] > x && !used[i][j]) {
ans++;
dfs(i, j);
}
}
}
console.log(ans)
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39