pat甲级1091. Acute Stroke (30 point(s))

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/88403521

欢迎访问我的pat甲级题解目录哦 https://blog.csdn.net/richenyunqi/article/details/84981078

题目描述

pat甲级1091. Acute Stroke描述

题意解析

题目给了一个 M × N × L M×N×L 的三维图,找出这个三维图结点数量高于t的连通块,将每个这样的连通块的结点数量进行加和,然后输出

算法设计

使用BFS算法遍历每个连通块,求出其结点总数,将节点数量大于等于t的连通块的结点数量进行累计即可。

注意点

本题不能使用DFS遍历,否则会造成两个测试点递归爆栈

C++代码

#include<bits/stdc++.h>
using namespace std;
struct Node{
    int x,y,z;
    Node(int xx,int yy,int zz):x(xx),y(yy),z(zz){}
};
int m,n,l,t,ans=0,direct[6][3]={//6个方向
    {-1,0,0},{0,1,0},{1,0,0},{0,-1,0},{0,0,1},{0,0,-1},
};
bool graph[1300][130][80];
int BFS(Node p){
    int num=0;
    queue<Node>q;
    q.push(p);
    graph[p.x][p.y][p.z]=false;
    while(!q.empty()){
        p=q.front();
        q.pop();
        ++num;
        for(int i=0;i<6;++i){
            int x=p.x+direct[i][0],y=p.y+direct[i][1],z=p.z+direct[i][2];
            if(x>=0&&x<m&&y>=0&&y<n&&z>=0&&z<l&&graph[x][y][z]){
                q.push(Node(x,y,z));
                graph[x][y][z]=false;
            }
        }
    }
    return num;
}
int main(){
    scanf("%d%d%d%d",&m,&n,&l,&t);
    for(int k=0;k<l;++k)
        for(int i=0;i<m;++i)
            for(int j=0;j<n;++j)
                scanf("%d",&graph[i][j][k]);
    for(int i=0;i<m;++i)
        for(int j=0;j<n;++j)
            for(int k=0;k<l;++k)
                if(graph[i][j][k]){
                    int temp=BFS(Node(i,j,k));
                    if(temp>=t)
                        ans+=temp;
                }
    printf("%d",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/richenyunqi/article/details/88403521