题目链接:L3-004 肿瘤诊断 (30分)

  1. 两个像素被认为是“连通的”,如果它们有一个共同的切面 --->从这句话推断出这题是一个三维BFS的题
  2. 用一个三维数组存放数据,遍历每一个数据,因为这里的数据是0和1就用原数据来记录标记它,计算每一个元素周围的体积(数连通体中1的个数),大于t就累加到体积里面

代码如下:

#include<iostream>
#include<queue>

using namespace std;

const int N = 140, M = 1300,L = 70;

struct Node{
    int x,y,z;
};

int mp[L][M][N];
int dx[6] = {0,1,0,-1,0,0};
int dy[6] = {1,0,-1,0,0,0};
int dz[6] = {0,0,0,0,1,-1};
int n,m,l,t;
int ans;

void bfs(int i,int j,int k){
    queue<Node> q;
    int sum = 1;
    mp[i][j][k] = 0;
    q.push({j,k,i});
    while(q.size()){
        Node t = q.front();
        q.pop();
        for(int i = 0; i < 6; i ++ ){
            int a = t.x + dx[i];
            int b = t.y + dy[i];
            int c = t.z + dz[i];
            if(a < 0 || a > n-1 || b < 0 || b > m-1 || c < 0 || c > l-1){
                continue;
            }
            if(!mp[c][a][b]) continue;
            mp[c][a][b] = 0;
            sum ++;
            q.push({a,b,c});
        }
    }
    if(sum >= t) ans += sum;
}
int main(){
    cin >> 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 ++ ){
                cin >> 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]) bfs(i,j,k);
            }
        }
    }
    cout<<ans;
    return 0;
}