5-13 肿瘤诊断 (30分)

来源:互联网 发布:我国网络舆论积极作用 编辑:程序博客网 时间:2024/05/24 01:55

5-13 肿瘤诊断 (30分)
在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环。给定病灶扫描切片中标注出的疑似肿瘤区域,请你计算肿瘤的体积。
输入格式:

输入第一行给出4个正整数:MM、NN、LL、TT,其中MM和NN是每张切片的尺寸(即每张切片是一个M\times NM×N的像素矩阵。最大分辨率是1286\times 1281286×128);LL(\le 60≤60)是切片的张数;TT是一个整数阈值(若疑似肿瘤的连通体体积小于TT,则该小块忽略不计)。
最后给出LL张切片。每张用一个由0和1组成的M\times NM×N的矩阵表示,其中1表示疑似肿瘤的像素,0表示正常像素。由于切片厚度可以认为是一个常数,于是我们只要数连通体中1的个数就可以得到体积了。麻烦的是,可能存在多个肿瘤,这时我们只统计那些体积不小于TT的。两个像素被认为是“连通的”,如果它们有一个共同的切面,如下图所示,所有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<iostream>#include<queue>using namespace std;struct point {int first;int second;int third;};int a[61][1289][130];int t1,t2,t3,t4;int n,m;int l,t;int sum=0;int  bfs(int i,int j,int k){    sum=0;    queue<struct point >que;    struct point p,te;        que.push( {i,j,k});    while(que.size())    {        sum++;        p=que.front();        que.pop();        int temp1=p.first;        int temp2=p.second;        int temp3=p.third;        a[temp1][temp2][temp3]=0;        if (temp3-1>=0&&a[temp1][temp2][temp3-1]==1)        {            que.push({temp1,temp2,temp3-1});            a[temp1][temp2][temp3-1]=0;        }        if (temp3+1<n&&a[temp1][temp2][temp3+1]==1)        {            que.push({temp1,temp2,temp3+1});           a[temp1][temp2][temp3+1]=0;        }        if (temp2-1>=0&&a[temp1][temp2-1][temp3]==1)        {            que.push({temp1,temp2-1,temp3});           a[temp1][temp2-1][temp3]=0;        }        if (temp2+1<m&&a[temp1][temp2+1][temp3]==1)        {            que.push({temp1,temp2+1,temp3});            a[temp1][temp2+1][temp3]=0;        }         if (temp1-1>=0&&a[temp1-1][temp2][temp3]==1)        {            que.push({temp1-1,temp2,temp3});            a[temp1-1][temp2][temp3]=0;        }        if (temp1+1<l&&a[temp1+1][temp2][temp3]==1)        {            que.push({temp1+1,temp2,temp3});            a[temp1+1][temp2][temp3]=0;        }    }    if(sum>=t)        return sum;    else        return 0;}int main(){    int Sum=0;    cin>>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++)            {                cin>>a[i][j][k];            }        }    }         for (int i=0;i<l;i++)    {        for (int j=0;j<m;j++)        {            for(int k=0;k<n;k++)            {                if(a[i][j][k])                {                    Sum+=bfs(i,j,k);                }            }        }    }      cout<<Sum;    return 0;}
0 0