思路
广度优先遍历,感觉比较简单,不多说。但有一个要注意,三维数组的定义要放在main函数外,也就是作为全局变量,否则会出现段错误。
#include <cstdio>
#include <queue>
using namespace std;
struct pixel
{
int x, y, z;
};
int dirX[6] = {1, -1, 0, 0, 0, 0};
int dirY[6] = {0, 0, 1, -1, 0, 0};
int dirZ[6] = {0, 0, 0, 0, 1, -1};
int M, N, L, T, pixels[61][1290][130], visited[61][1290][130];
int main(){
scanf("%d%d%d%d", &M, &N, &L, &T);
for(int i = 0; i < L; i++)
for(int j = 0; j < M; j++)
for(int k = 0; k < N; k++)
scanf("%d", &pixels[i][j][k]);
int ans = 0;
for(int i = 0; i < L; i++)
for(int j = 0; j < M; j++)
for(int k = 0; k < N; k++){
int cnt = 0;
queue<pixel> q;
if(pixels[i][j][k] == 1 && visited[i][j][k] != 1){
pixel p = {i, j ,k};
visited[i][j][k] = 1;
q.push(p);
cnt++;
}
else
continue;
while(!q.empty()){
pixel p = q.front();
q.pop();
for(int d = 0; d < 6; d++){
int newX = p.x + dirX[d];
int newY = p.y + dirY[d];
int newZ = p.z + dirZ[d];
if(newX >= 0 && newX < L && newY >= 0 && newY < M && newZ >= 0 && newZ < N)
if(pixels[newX][newY][newZ] == 1 && visited[newX][newY][newZ] == 0){
pixel tmp = {newX, newY, newZ};
visited[newX][newY][newZ] = 1;
q.push(tmp);
cnt++;
}
else
continue;
}
}
if(cnt >= T)
ans += cnt;
}
printf("%d\n", ans);
return 0;
}