题目
思路
三维变量的广度优先遍历(多连通分量),题意太难理解了 ,原本以为是对每个点的六个方向计数,如果大于阈值就sum+1,结果是判断整个连通分量的数量是否大于阈值,如果大于就加上连通分量的数量。
代码
#include <iostream>
#include<queue>
using namespace std;
const int nmax = 100005;
const int xmax = 1300;
const int ymax = 130;
const int zmax = 65;
int m, n, l, t;
int sum = 0;
int graph[zmax][xmax][ymax];
int visited[zmax][xmax][ymax];
typedef struct
{
int x, y, z;
}pos;
int BFS(pos p) {
queue<pos> q;
q.push(p);
int cnt = 0;
while (!q.empty()) {
pos tmp = q.front();
q.pop();
cnt++;
//向六个方向探索:
if (tmp.z > 0 && graph[tmp.z - 1][tmp.x][tmp.y]) {
if (!visited[tmp.z - 1][tmp.x][tmp.y]) {
visited[tmp.z - 1][tmp.x][tmp.y] = 1;
q.push(pos{ tmp.x,tmp.y,tmp.z - 1 });
}
}
if (tmp.z < l - 1 && graph[tmp.z + 1][tmp.x][tmp.y]) {
if (!visited[tmp.z + 1][tmp.x][tmp.y]) {
visited[tmp.z + 1][tmp.x][tmp.y] = 1;
q.push(pos{ tmp.x,tmp.y,tmp.z + 1 });
}
}
if (tmp.x > 0 && graph[tmp.z][tmp.x-1][tmp.y]) {
if (!visited[tmp.z][tmp.x - 1][tmp.y]) {
visited[tmp.z][tmp.x - 1][tmp.y] = 1;
q.push(pos{ tmp.x - 1,tmp.y,tmp.z });
}
}
if (tmp.x <m- 1 && graph[tmp.z][tmp.x+1][tmp.y]) {
if (!visited[tmp.z][tmp.x + 1][tmp.y]) {
visited[tmp.z][tmp.x + 1][tmp.y] = 1;
q.push(pos{ tmp.x + 1,tmp.y,tmp.z });
}
}
if (tmp.y > 0 && graph[tmp.z][tmp.x][tmp.y - 1]) {
if (!visited[tmp.z][tmp.x][tmp.y - 1]) {
visited[tmp.z][tmp.x][tmp.y - 1] =1;
q.push(pos{ tmp.x,tmp.y - 1,tmp.z });
}
}
if (tmp.y< n - 1 && graph[tmp.z][tmp.x][tmp.y+1]) {
if (!visited[tmp.z][tmp.x][tmp.y + 1]) {
visited[tmp.z][tmp.x][tmp.y + 1] = 1;
q.push(pos{ tmp.x,tmp.y + 1,tmp.z });
}
}
}
if (cnt >= t)
return cnt;
else
return 0;
}
int main()
{
cin >> 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)
cin >> graph[i][j][k];
memset(visited, 0, sizeof(visited));
for (int i = 0; i < l; ++i)
for (int j = 0; j < m; ++j)
for (int k = 0; k < n; ++k) {
if (!visited[i][j][k] && graph[i][j][k]) {
visited[i][j][k] = 1;
sum += BFS(pos{j,k,i});
}
}
cout << sum;
return 0;
}