刷题日记—数组—布尔数组的应用

前几天刷题碰到了种树,切方块类型的题目,这类题目用布尔类型判断每一个个体的状态,最后根据每个元素对应的布尔值来统计数目:如下:
1.移数问题:
image
解题步骤如下:```plaintext

include

using namespace std;
bool flag[10001];
int main(){
int l,m;
while(cin>>l>>m){
while(m--){
int x1,x2;
cin>>x1>>x2;
for(int i=x1;i<=x2;++i){
flag[i]=true;
}
}
int cnt=0;
for(int i=0;i<=l;++i){
if(!(flag[i])){
cnt++;
}
}
cout<<cnt<<endl;

}
return 0;

}

 ==这里有一个细节点:bool数组是定义在main函数外的,因为如果定义在main函数里面,会导致bool数组被随机赋值,而定义在main函数外则是全都赋初始值为0。==
2.切割方块问题
题目如图
![image](https://img2024.cnblogs.com/blog/3713817/202510/3713817-20251025223155222-2117006809.png)
解题:```plaintext
#include<iostream>
using namespace std;
bool flag[21][21][21];
int main() {
    int w, x, h;
    cin >> w >> x >> h;
        for (int i = 1; i <= w; ++i) {
            for (int j = 1; j <= x; ++j) {
                for (int k = 1; k <= h; ++k) {
                    flag[i][j][k] = 1;



                }
            }
        }

    
    int q;
    cin >> q;
    while (q--) {
        int x1, x2, y1, y2, z1, z2;
        cin >> x1 >> y1 >> z1 >> x2 >> y2 >> z2;
        for (int i = x1; i <= x2; ++i) {
            for (int j = y1; j <= y2; ++j) {
                for (int k = z1; k <= z2; ++k) {
                    flag[i][j][k] = 0;
                }
            }
        }

    }
    int cnt = 0;
    for (int i = 1; i <= w; ++i) {
        for (int j = 1; j <= x; ++j) {
            for (int k = 1; k <= h; ++k) {
                if (flag[i][j][k] == 1) {
                    cnt++;
                }



            }
        }
    }

    cout << cnt;

    return 0;
}

写完上面两题,我们应该就能体会到bool数组的优越性了,它可以描述某一位置的状态,避免重叠区间情况的反复取值造成的运算错误,从而实现精准计数,避免同一位置的多次取值。

在解题过程中常见的错误:1.条件运算符“==”写成了赋值运算符“=”导致WA;
2.局部变量的定义位置错误,导致每次循环都重置初始值或者无法使用定义值。

posted @ 2025-10-25 22:48  MaoS1mple  阅读(6)  评论(0)    收藏  举报