题目:
题目描述:略
输入输出样例
示例
输入
2 2 2 3
1 1 1 1 1 1 1 1
1 2 1 2 1 1 1
1 1 1 2 1 2 1
1 1 1 1 1 1 2
输出
2
思路:
暴力破解:
- 读懂题意(难点)
- 给每个战舰(i, j, k)赋于生命值d(i, j ,k)
- 循环m轮攻击,每轮攻击相当于防御值d(i, j ,k)down操作,直到防御值 d(i, j ,k) < 0时终止输出结果。
问题:
- 如何表示三维数据呢
因为C++三维数组使用麻烦,所以将其转为一维数组进行处理。 - 如何快速读取行数据(int)呢
代码:
#include<bits/stdc++.h>
using namespace std;
int A,B,C,m;
//快速读取输入
int getInt(){
//getchar():一次读取一个字节,输入数据一次缓存,多次读取,加快数据读取速度
char ch = getchar();
int x=0,f=1;
//去掉该层while好像也能得出正确结果,因为输入的数据没有负数
while(ch < '0' || ch > '9'){
if(ch == '-'){
f = -1;
ch = getchar();
}
}
while(ch >= '0' && ch <='9'){
//ch - '0'将ASCII值转成十进制值
x = x * 10 + ch - '0';
ch = getchar();
}
return x*f;
}
//三维数据转为一维数据
int getindex(int i, int j, int k){
return ((i - 1) * B + (j -1))*C + k;
}
int main(){
//快速读取
A = getInt();
B = getInt();
C = getInt();
m = getInt();
// 用于存放三维数据,即小方格的生命值属性d(i,j,k)
int *data = new int[A * B * C + 1];
// 用于存放三体人每轮的攻击力参数
int (*atk)[7] = new int[m + 1][7];
//赋值给d(i,j,k)
for(int i = 1;i <= A;i++){
for(int j = 1; j <= B;j++){
for(int k = 1;k <= C; k++){
data[getindex(i,j,k)] = getInt();
}
}
}
//战舰被攻击
for(int i = 1; i <= m; i++){
//7个参数赋值
for(int j = 0;j < 7 ;j++){
atk[i][j] = getInt();
}
//进行比较
for(int x = atk[i][0];x <= atk[i][1];x++){
for(int y = atk[i][2]; y <= atk[i][3];y++){
for(int z = atk[i][4];z <= atk[i][5]; z++){
data[getindex(x,y,z)] -= atk[i][6];
if(data[getindex(x,y,z)] < 0){
cout<<i<<endl;
delete []data;
delete []atk;
return 0;
}
}
}
}
}
return 0;
}
总结:
1.一二维数组的声明与初始化赋值
2. 快速读取模板
3. c++三维数组转一维数组
4. getchar()函数的使用