# 【华为OD题库-042】战场索敌-java

112 篇文章 18 订阅

## 题目

N表示地图的行数，M表示地图的列数，K表示目标敌人数量N，M<=100

3 5 2
…#EE
E.#E.
###…

1

## 思路

1. 如果某个位置不为‘#’,那么从此位置递归遍历，找上下左右不为‘#’的区域，计算其中的E的数量，并且将该区域标记为已访问
2. 下次遍历时，如果字符不为#且该位置未被遍历过，说明是一个新区域
3. 最后计算E数量小于K的区域个数

## 题解

package hwod;

import java.util.Arrays;
import java.util.Scanner;

public class BattlefieldFindEnemy {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int n = nums[0], m = nums[1], k = nums[2];
char[][] arrs = new char[n][m];
for (int i = 0; i < n; i++) {
arrs[i] = sc.nextLine().toCharArray();
}
System.out.println(battleFieldFindEnemy(arrs, k));
}

private static int battleFieldFindEnemy(char[][] arrs, int k) {
int ans = 0;
for (int i = 0; i < arrs.length; i++) {
for (int j = 0; j < arrs[0].length; j++) {
if (arrs[i][j] != '#' && recur(arrs, i, j) < k) {
ans++;
}
}
}
return ans;
}

private static int recur(char[][] arrs, int i, int j) {
int res = 0;
if (i < 0 || j < 0 || i >= arrs.length || j >= arrs[0].length || arrs[i][j] == '#') return res;
if (arrs[i][j] == 'E') res++;
arrs[i][j] = '#';
return res + recur(arrs, i + 1, j) + recur(arrs, i - 1, j) + recur(arrs, i, j + 1) + recur(arrs, i, j - 1);
}
}


package hwod;

import java.util.Arrays;
import java.util.Scanner;

public class BattlefieldFindEnemy {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int n = nums[0], m = nums[1], k = nums[2];
char[][] arrs = new char[n][m];
for (int i = 0; i < n; i++) {
arrs[i] = sc.nextLine().toCharArray();
}
System.out.println(battleFieldFindEnemy2(arrs, k));
}

private static int[][] visted;

private static int battleFieldFindEnemy2(char[][] arrs, int k) {
int ans = 0;
visted = new int[arrs.length][arrs[0].length];
for (int i = 0; i < arrs.length; i++) {
for (int j = 0; j < arrs[0].length; j++) {
if (visted[i][j] == 0 && arrs[i][j] != '#' && recur2(arrs, i, j) < k) {
ans++;
}
}
}
return ans;
}

private static int recur2(char[][] arrs, int i, int j) {
int res = 0;
if (i < 0 || j < 0 || i >= arrs.length || j >= arrs[0].length || visted[i][j] == 1 || arrs[i][j] == '#')
return res;
if (arrs[i][j] == 'E') res++;
visted[i][j] = 1;
return res + recur(arrs, i + 1, j) + recur(arrs, i - 1, j) + recur(arrs, i, j + 1) + recur(arrs, i, j - 1);
}
}



## 说明

• 8
点赞
• 9
收藏
觉得还不错? 一键收藏
• 0
评论
02-24
12-02 96
03-05
09-24
10-25
02-25 1530
02-28 325
02-28 375
02-28 351

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。