GPLT L3-004. 肿瘤诊断(三维bfs求连通块)
发布时间
阅读量:
阅读量
题意
确定三维空间中满足特定条件的所有连通区域,并计算每个区域所占的空间面积。即该区域内包含的1的数量,并且只有当这些区域的空间大小超过设定阈值时才会被纳入统计
思路
开始时用dfs做,栈溢出了。。。数据大了!
换成bfs寻找连通即可!
存图是zxy,而计算按照xyz了!!!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int mp[60+2][1286+2][128+2];
int ans;
struct unt {
int x,y,z;
};
int dx[]= {1,-1,0,0,0,0},dy[]= {0,0,1,-1,0,0},dz[]= {0,0,0,0,-1,1};
int t,m,n,l;
bool check(unt a) {
if(a.x>=0 && a.x<n && a.y>=0 && a.y<m && a.z>=0 && a.z<l && mp[a.z][a.x][a.y] == 1) return 1;
return 0;
}
void bfs(int x,int y,int z) {
unt cur= {x,y,z},next;
queue<unt>q;
q.push(cur);
int cnt = 1;
mp[z][x][y] = 0;
while(!q.empty()) {
cur = q.front();
q.pop();
for(int i=0; i<6; i++) {
next.x = cur.x+dx[i];
next.y = cur.y+dy[i];
next.z = cur.z+dz[i];
if(check(next)) {
mp[next.z][next.x][next.y] = 0;
q.push(next);
cnt++;
}
}
}
if(cnt>=t) ans+=cnt;
}
int main() {
scanf("%d%d%d%d",&n,&m,&l,&t);
for(int i=0; i<l; i++) {
for(int j=0; j<n; j++) {
for(int k=0; k<m; k++) {
scanf("%d",&mp[i][j][k]);
}
}
}
for(int i=0; i<l; i++) {
for(int j=0; j<n; j++) {
for(int k=0; k<m; k++) {
if(mp[i][j][k] == 1) bfs(j,k,i);
}
}
}
cout<<ans<<endl;
return 0;
}
全部评论 (0)
还没有任何评论哟~
