版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/88403521
欢迎访问我的pat甲级题解目录哦 https://blog.csdn.net/richenyunqi/article/details/84981078
题目描述
题意解析
题目给了一个
的三维图,找出这个三维图结点数量高于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;
}