PAT 甲级 1091 Acute Stroke

发布于:2025-02-25 ⋅ 阅读:(9) ⋅ 点赞:(0)

一开始只是简单的递归(bfs),导致最后两个没法通过(爆栈了)

//最后两个案例没有通过,只是最简单的bfs暴力算法
#include<cstdio>
using namespace std;
int v[62][1288][130]={0};
int find(int i,int j,int k){
    int sum=1;
    v[i][j][k]=2;
    if(v[i][j][k+1]==1) sum+=find(i,j,k+1);
    if(v[i][j][k-1]==1) sum+=find(i,j,k-1);
    if(v[i][j+1][k]==1) sum+=find(i,j+1,k);
    if(v[i][j-1][k]==1) sum+=find(i,j-1,k);
    if(v[i+1][j][k]==1) sum+=find(i+1,j,k);
    if(v[i-1][j][k]==1) sum+=find(i-1,j,k);
    return sum;
}
int main(){
    int m,n,l,t,ans=0,f;
    scanf("%d %d %d %d",&m,&n,&l,&t);
    // vector<vector<int>>v[l];
    for(int i=1;i<=l;i++){
        for(int j=1;j<=m;j++){
            for(int k=1;k<=n;k++){
                scanf("%d",&v[i][j][k]);
            }
        }
    }
    for(int i=1;i<=l;i++){
        for(int j=1;j<=m;j++){
            for(int k=1;k<=n;k++){
                if(v[i][j][k]==1){
                    f=find(i,j,k);
                    ans+=f>=t? f:0;
                }
            }
        }
    }
    printf("%d",ans);
    return 0;
}

后面看了书上的使用queue存储走过的路径,就不用使用递归了。

//求有问题的总体积
//AC
#include<cstdio>
#include<queue>
using namespace std;
int v[62][1288][130]={0};
struct node{
    int i,j,k;
};
queue <node> q;
int bfs(){
    int num=0;
    while(!q.empty()){
        node a=q.front();
        q.pop();
        int i=a.i,j=a.j,k=a.k;
        if(v[i][j][k]==2) continue;
        num++;
        v[i][j][k]=2;
        if(v[i][j][k+1]==1) q.push({i,j,k+1});
        if(v[i][j][k-1]==1) q.push({i,j,k-1});
        if(v[i][j+1][k]==1) q.push({i,j+1,k});
        if(v[i][j-1][k]==1) q.push({i,j-1,k});
        if(v[i+1][j][k]==1) q.push({i+1,j,k});
        if(v[i-1][j][k]==1) q.push({i-1,j,k});
    }
    return num;
}
int main(){
    int m,n,l,t,ans=0,f;
    scanf("%d %d %d %d",&m,&n,&l,&t);
    for(int i=1;i<=l;i++){
        for(int j=1;j<=m;j++){
            for(int k=1;k<=n;k++){
                scanf("%d",&v[i][j][k]);
            }
        }
    }
    for(int i=1;i<=l;i++){
        for(int j=1;j<=m;j++){
            for(int k=1;k<=n;k++){
                if(v[i][j][k]==1){
                    q.push({i,j,k});
                    f=bfs();
                    ans+=f>=t? f:0;
                }
            }
        }
    }
    printf("%d",ans);
    return 0;
}