题目:
题目描述:略
输入输出样例
示例
输入
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
思路:
**暴力破解:**
1. 读懂题意(难点)
2. 给每个战舰(i, j, k)赋于生命值d(i, j ,k)
3. 循环m轮攻击,每轮攻击相当于防御值d(i, j ,k)down操作,直到防御值 d(i, j ,k) < 0时终止输出结果。
问题:
1. 如何表示三维数据呢
因为C++三维数组使用麻烦,所以将其转为一维数组进行处理。
2. 如何快速读取行数据(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()函数的使用
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:387 |
WU-格式化数据输出 (C++代码)浏览:1312 |
蓝桥杯历届试题-翻硬币 (C++代码)浏览:953 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:416 |
整除的尾数 (C语言代码)浏览:852 |
杨辉三角 (C语言代码)浏览:734 |
1162答案错误,为什么浏览:700 |
C语言程序设计教程(第三版)课后习题9.3 (C语言代码)浏览:630 |
C语言训练-百钱百鸡问题 (C语言代码)浏览:541 |
【回文数(二)】 (C语言代码)浏览:729 |