题意
其实就是一个三维BFS的问题,计算满足大小的块(>=T
)一共有几个
思路
- 其实就是二维BFS扩展到三维空间的情况,无非就是把本来二维上扩展
4
个方向改成扩展6
个方向
const int dx[] = {0, -1, 0, 1, 0, 0};
const int dy[] = {-1, 0, 1, 0, 0, 0};
const int dz[] = {0, 0, 0, 0, 1, -1};
- 统计入队元素,看有没有>=
T
即可。几乎就是裸模板题了~
代码
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int dx[] = {0, -1, 0, 1, 0, 0};
const int dy[] = {-1, 0, 1, 0, 0, 0};
const int dz[] = {0, 0, 0, 0, 1, -1};
struct Node{
int x, y, z;
};
int cub[1300][150][80] = {0};
bool vis[1300][150][80] = {false};
int M, N, L, T;
int level = 0;
int sum = 0;
bool judge(int x, int y, int z)
{
if(x < 0 || x >= M ||
y < 0 || y >= N ||
z < 0 || z >= level)
return false;
if(cub[x][y][z] == 0 || vis[x][y][z] == true) return false;
return true;
}
void bfs(int x, int y, int z)
{
int cur_sum = 1;
Node cur;
cur.x = x; cur.y = y; cur.z = z;
queue<Node> q;
q.push(cur);
vis[x][y][z] = true;
while(!q.empty())
{
auto tmp = q.front();
q.pop();
for(int i=0;i<6;i++)
{
int tx = tmp.x + dx[i];
int ty = tmp.y + dy[i];
int tz = tmp.z + dz[i];
if(judge(tx, ty, tz))
{
vis[tx][ty][tz] = true;
cur.x = tx, cur.y = ty, cur.z = tz;
q.push(cur);
cur_sum++;
}
}
}
if(cur_sum >= T)
sum += cur_sum;
}
int main()
{
cin >> M >> N >> L >> T;
while(L--)
{
for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
scanf("%d", &cub[i][j][level]);
level++;
}
for(int k=0;k<level;k++)
for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
if(cub[i][j][k] == 1 && !vis[i][j][k])
bfs(i, j, k);
cout << sum << endl;
return 0;
}