L3-004 肿瘤诊断 (30 分)

L3-004 肿瘤诊断 (30 分)

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

输入格式:

输入第一行给出 \(4\) 个正整数:\(M\)\(N\)\(L\)\(T\),其中 \(M\)\(N\) 是每张切片的尺寸(即每张切片是一个 \(M \times N\) 的像素矩阵。最大分辨率是 \(1286 \times 128\));\(L \; (\leq 60)\) 是切片的张数;\(T\) 是一个整数阈值(若疑似肿瘤的连通体体积小于 \(T\),则该小块忽略不计)。
最后给出 \(L\) 张切片。每张用一个由 \(0\)\(1\) 组成的 \(M \times 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

参考代码:

#include<bits/stdc++.h>
using namespace std;
int m,n,l,t,ans,dx[]={-1,1,0,0,0,0,},dy[]={0,0,-1,1,0,0},dz[]={0,0,0,0,-1,1},a[1300][130][65];
struct it{int x,y,z;};
inline int Bfs(int x,int y,int z)
{
    queue<it>q;
    a[x][y][z]=0;
    int tot=1;
    q.push((it){x,y,z});
    while(!q.empty())
    {
        it s=q.front();
        q.pop();
        for(int i=0;i<6;i++)
        {
            int nx=s.x+dx[i],ny=s.y+dy[i],nz=s.z+dz[i];
            if(a[nx][ny][nz])
            {
                a[nx][ny][nz]=0;
                tot++;
                q.push((it){nx,ny,nz});
            }
        }
    }
    if(tot>=t)return tot;
    else return 0;
}
int main()
{
    cin>>m>>n>>l>>t;
    for(int i=1;i<=l;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=n;k++)
                cin>>a[j][k][i];
    for(int i=1;i<=l;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=n;k++)
                if(a[j][k][i])ans+=Bfs(j,k,i);
    cout<<ans<<endl;
    return 0;
}
posted @ 2020-06-01 19:48  冷蕴  阅读(129)  评论(0编辑  收藏  举报