蓝桥杯----三体攻击(java)

在这里插入图片描述
—————————————————————————————————————————————————
样例解读: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,还是老老实实用三维数组。

发布了177 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/QinLaoDeMaChu/article/details/105577919