参考了网上的代码
#include <queue>
#include <iostream>
using namespace std;
struct node{
int x,y,z;
};
int n,m,h,t;
int graph[1290][130][61];
bool visited[1290][130][61]={false};
int X[6]={0,0,0,0,1,-1};
int Y[6]={0,0,1,-1,0,0};
int Z[6]={1,-1,0,0,0,0};
bool judge(int x,int y,int z){
if(x>=n||x<0||y>m||y<0||z>h||z<0){
return false;
}
return !(visited[x][y][z] || graph[x][y][z] == 0);
}
int bfs(int x,int y,int z){
int res=0;
queue<node> queue1;
node node1;
node1.x=x;
node1.y=y;
node1.z=z;
queue1.push(node1);
visited[x][y][z]= true;//这一行曾经丢过,不能丢
while (!queue1.empty()){
node top=queue1.front();
queue1.pop();
res++;
for (int i = 0; i < 6; ++i) {//代表6个方向
int nx=top.x+X[i];
int ny=top.y+Y[i];
int nz=top.z+Z[i];
if(judge(nx,ny,nz)){
node node2;
node2.x=nx;
node2.y=ny;
node2.z=nz;
queue1.push(node2);
visited[nx][ny][nz]= true;
}
}
}
if(res>=t){
return res;
}
return 0;
}
int main(){
cin>>n>>m>>h>>t;
for (int k = 0; k < h; ++k) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin>>graph[i][j][k];
}
}
}
int res=0;
for (int k = 0; k < h; ++k) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if(graph[i][j][k]==1&&!visited[i][j][k]){
int a=bfs(i,j,k);
if(a>=t){
res+=a;
}
}
}
}
}
cout<<res<<endl;
return 0;
};