很简单三维搜索,可以用BFS或者DFS。但是DFS好像会爆栈,有两个测试用例过不了。BFS程序如下:
#include <bits/stdc++.h>
using namespace std;
int I[1286][128][60];
int m, n, l, t;
int vis[1286][128][60];
int dir[6][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
bool bound(int x, int y, int z)
{
if(x>=0 && x<m && y>=0 && y<n && z>=0 && z<l) return true;
return false;
}
struct Node
{
int x, y, z, val;
};
int bfs(int x, int y, int z)
{
int count = 0;
queue<Node> q;
Node node;
node.x = x; node.y = y; node.z = z; node.val = I[x][y][z];
vis[x][y][z] = 1;
q.push(node);
while(!q.empty())
{
Node t = q.front();
q.pop();
count++;
for (int i = 0; i < 6; ++i)
{
Node t_next;
t_next.x = t.x+dir[i][0]; t_next.y = t.y+dir[i][1]; t_next.z = t.z+dir[i][2];
if(bound(t_next.x, t_next.y, t_next.z))
{
t_next.val = I[t_next.x][t_next.y][t_next.z];
if(vis[t_next.x][t_next.y][t_next.z]==0 && t_next.val==1)
{
q.push(t_next);
vis[t_next.x][t_next.y][t_next.z] = 1;
}
}
}
}
return count;
}
int main(int argc, char const *argv[])
{
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", &I[j][k][i]);
}
}
}
int res = 0;
for (int i = 0; i < l; ++i)
{
for (int j = 0; j < m; ++j)
{
for (int k = 0; k < n; ++k)
{
if(I[j][k][i]==1 && vis[j][k][i]==0)
{
int temp = bfs(j, k, i);
if(temp>=t) res+=temp;
}
}
}
}
printf("%d\n", res);
return 0;
}
DFS程序如下:
#include <bits/stdc++.h>
using namespace std;
int I[1286][128][60];
int m, n, l, t;
int vis[1286][128][60];
int dir[6][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
bool bound(int x, int y, int z)
{
if(x>=0 && x<m && y>=0 && y<n && z>=0 && z<l) return true;
return false;
}
struct Node
{
int x, y, z, val;
};
vector<int> cnt;
void dfs(int x, int y, int z)
{
cnt.push_back(1);
vis[x][y][z] = 1;
for (int i = 0; i < 6; ++i)
{
x += dir[i][0]; y += dir[i][1]; z += dir[i][2];
if(bound(x, y, z) && vis[x][y][z]==0 && I[x][y][z]==1)
{
vis[x][y][z] = 1;
dfs(x, y, z);
}
}
}
int main(int argc, char const *argv[])
{
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", &I[j][k][i]);
}
}
}
int res = 0;
for (int i = 0; i < l; ++i)
{
for (int j = 0; j < m; ++j)
{
for (int k = 0; k < n; ++k)
{
if(I[j][k][i]==1 && vis[j][k][i]==0)
{
cnt.clear();
dfs(j, k, i);
if(cnt.size()>=t) res+=cnt.size();
}
}
}
}
printf("%d\n", res);
return 0;
}