用java实现: 有一个大小是NxM的战场地图, 被墙壁'#'分隔成大小不同的区域,上下左右四个方向相邻的空地'.'属于同一个区域,只有空地上可能存在敌人'E',请求出地图上总共有多少区域里的敌人数小于K。 输入描述: 1、第一行输入为N,M,K; 2、N表示地图的行数, M表示地图的列数, K表示目标敌人数量 N,M<=100; 3、之后为一个NxM大小的字符数组。 输出描述: 敌人数小于K的区域数量 输入示例: 3 5 2 ..#EE E.#E. ###.. 输出示例: 1
时间: 2024-02-06 12:12:28 浏览: 25
以下是Java代码实现:
```java
import java.util.Scanner;
public class Main {
static char[][] map;
static boolean[][] visited;
static int n, m, k;
static int[] dx = {1, -1, 0, 0};
static int[] dy = {0, 0, 1, -1};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
k = scanner.nextInt();
map = new char[n][m];
visited = new boolean[n][m];
scanner.nextLine();
for (int i = 0; i < n; i++) {
String line = scanner.nextLine();
for (int j = 0; j < m; j++) {
map[i][j] = line.charAt(j);
}
}
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (map[i][j] == '.' && !visited[i][j]) {
int enemyCount = dfs(i, j);
if (enemyCount < k) {
count++;
}
}
}
}
System.out.println(count);
}
private static int dfs(int x, int y) {
visited[x][y] = true;
int count = 0;
if (map[x][y] == 'E') {
count++;
}
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && map[nx][ny] == '.') {
count += dfs(nx, ny);
}
}
return count;
}
}
```
思路:
题目要求统计地图上敌人数小于 K 的区域数量,我们可以遍历整个地图,对于每个连通的空地区域,计算其中敌人的数量,如果小于 K,则将区域数量加 1。
具体实现可以使用深度优先搜索(DFS)来遍历连通的空地区域,对于每个空地,如果它没有被访问过且没有墙壁,则从该空地开始进行 DFS 遍历,同时统计该区域中敌人的数量,最后返回敌人数量。
需要注意的是,当进行 DFS 遍历时,需要将已经访问过的空地标记为已访问,防止重复计算。
阅读全文