L3-004 肿瘤诊断

·   ·   ·   ·

  ·   ·


L3-004 肿瘤诊断 (30 分)

在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环。给定病灶扫描切片中标注出的疑似肿瘤区域,请你计算肿瘤的体积。

输入格式:

输入第一行给出4个正整数:_M_、_N_、_L_、_T_,其中_M_和_N_是每张切片的尺寸(即每张切片是一个_M_×_N_的像素矩阵。最大分辨率是1286×128);_L_(≤60)是切片的张数;_T_是一个整数阈值(若疑似肿瘤的连通体体积小于_T_,则该小块忽略不计)。

最后给出_L_张切片。每张用一个由0和1组成的_M_×_N_的矩阵表示,其中1表示疑似肿瘤的像素,0表示正常像素。由于切片厚度可以认为是一个常数,于是我们只要数连通体中1的个数就可以得到体积了。麻烦的是,可能存在多个肿瘤,这时我们只统计那些体积不小于_T_的。两个像素被认为是“连通的”,如果它们有一个共同的切面,如下图所示,所有6个红色的像素都与蓝色的像素连通。

输出格式:

在一行中输出肿瘤的总体积。

输入样例:

3 4 5 2
1 1 1 1
1 1 1 1
1 1 1 1
0 0 1 1
0 0 1 1
0 0 1 1
1 0 1 1
0 1 0 0
0 0 0 0
1 0 1 1
0 0 0 0
0 0 0 0
0 0 0 1
0 0 0 1
1 0 0 0

输出样例:

26

分析

三维BFS,table[][][] 数组存储切片,of[][] 数组存储偏移量

对于每一个为 $1$ 的点,BFS 遍历其周围的六个值,每个已经遍历过的值设置为 $0$,cnt 记录本次 BFS 遍历的体积,最后判断是否大于 T 即可

代码实现

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

int of[6][3] = {{-1, 0, 0}, {0, 0, -1}, {0, -1, 0}, {0, 0, 1}, {0, 1, 0}, {1, 0, 0}};
bool table[61][1291][131];
int n, m, l, t, ans;

struct node
{
    int x, y, z;
    node(int a, int b, int c) : x(a), y(b), z(c){};
};

void bfs(int x, int y, int z)
{
    queue<node> q;
    q.push(node(x, y, z));
    int cnt = 1;
    table[x][y][z] = 0;
    while (!q.empty())
    {
        node tn = q.front();
        q.pop();
        int tx = tn.x, ty = tn.y, tz = tn.z;
        for (int i = 0; i < 6; ++i)
        {
            tx = tn.x + of[i][0];
            ty = tn.y + of[i][1];
            tz = tn.z + of[i][2];
            if (!(tx < 0  ty < 0  tz < 0  tx > l  ty > n  tz > m) && table[tx][ty][tz])
            {
                cnt++;
                table[tx][ty][tz] = 0;
                q.push(node(tx, ty, tz));
            }
        }
    }
    if (cnt >= t)
        ans += cnt;
}

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 >> table[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 (table[i][j][k])
                    bfs(i, j, k);

    cout << ans << endl;
    return 0;
}