—————————————————————————————————————————————————
样例解读:2 2 2 3 表示有 2 层,每一层都是 2 行 2 列 的阵容,共 8 艘战舰, m=3 表示 3 轮攻击,下面那 8 个 1 表示 8 艘战舰的生命值
((i-1) x B + (j-1)) x C + k + (k-1) ,这是三维坐标 (i, j, k) 映射到一维下标的公式。
最后三行表示 3 轮攻击的范围:
第一轮攻击:[1, 2] 层的 [1, 2] 行 [1, 1] 列的战舰,生命值全部减1
第二轮攻击:[1, 1] 层的 [1, 2] 行 [1, 2] 列的战舰,生命值全部减1
第一轮攻击示意图如下,攻击到红点的四个战舰
方法1:暴力(能得70%左右的分数)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int a;
static int b;
static int c;
static int m;
static int[][][] data;//data[i][j][k]:(i, j, k)位置战舰的血量
static int ans;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s1 = br.readLine().split(" ");
a = Integer.parseInt(s1[0]);
b = Integer.parseInt(s1[1]);
c = Integer.parseInt(s1[2]);
m = Integer.parseInt(s1[3]);
data = new int[a + 1][b + 1][c + 1];
String[] s2 = br.readLine().split(" ");
int index = 0;
for(int i = 1;i <= a;i++) {
for(int j = 1;j <= b;j++) {
for(int k = 1;k <= c;k++) {
data[i][j][k] = Integer.parseInt(s2[index++]);
}
}
}
int lat, rat, lbt, rbt, lct, rct, ht;
for(int p = 1;p <= m;p++) {//第 p 轮攻击
String[] s3 = br.readLine().split(" ");
lat = Integer.parseInt(s3[0]);
rat = Integer.parseInt(s3[1]);
lbt = Integer.parseInt(s3[2]);
rbt = Integer.parseInt(s3[3]);
lct = Integer.parseInt(s3[4]);
rct = Integer.parseInt(s3[5]);
ht = Integer.parseInt(s3[6]);
for(int i = lat;i <= rat;i++) {//枚举攻击范围内的每个战舰
for(int j = lbt;j <= rbt;j++) {
for(int k = lct;k <= rct;k++) {
data[i][j][k] -= ht;
if(data[i][j][k] < 0) {
System.out.println(p);
return ;
}
}
}
}
}
}
}
本来data 用的是一维数组,然后用那个转换公式把(i,j,k)映射到一维数组的下标,不知道为啥一直是Wrong Answer,还是老老实实用三维数组。