分析:三维BFS,相当于每个面进行叠放,一个面和上面的面以及下面的面相邻,注意三维数组定义的时候大范围的维定义在前面,否则最后两个点超时。。很迷
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
typedef struct Node{
int x, y, z;
}Node;
int arr[1300][130][63], vis[1300][130][63];
int m, n, l, t, res;
int dirz[] = {-1, 1, 0, 0, 0, 0};
int dirx[] = {0, 0, -1, 0, 1, 0};
int diry[] = {0, 0, 0, -1, 0, 1};
int bfs(int x, int y, int z){
int block = 0;
Node node;
node.x = x;
node.y = y;
node.z = z;
queue<Node> q;
q.push(node);
vis[x][y][z] = 1;
while(!q.empty()){
Node cur = q.front();
q.pop();
block++;
for(int i = 0; i<6; i++){
int nowx = cur.x + dirx[i];
int nowy = cur.y + diry[i];
int nowz = cur.z + dirz[i];
if(nowx < 0 || nowx >= m || nowy < 0 || nowy >= n ||
nowz < 0 || nowz >= l || vis[nowx][nowy][nowz] || !arr[nowx][nowy][nowz]) continue;
vis[nowx][nowy][nowz] = 1;
node.x = nowx; node.y = nowy; node.z = nowz;
q.push(node);
}
}
return block >= t ? block : 0;
}
int main(){
//freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
int i, j, k;
cin >> m >> n >> l >> t;
for(k = 0; k<l; k++){
for(i = 0; i<m; i++)
for(j = 0; j<n; j++)
cin >> arr[i][j][k];
}
for(k = 0; k<l; k++){
for(i = 0; i<m; i++){
for(j = 0; j<n; j++)
if(arr[i][j][k] && !vis[i][j][k])
res += bfs(i, j, k);
}
}
cout << res << endl;
return 0;
}