L3-004 肿瘤诊断(30 分)

╰+哭是因爲堅強的太久メ 2022-05-23 11:21 248阅读 0赞

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

输入格式:

输入第一行给出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个红色的像素都与蓝色的像素连通。

5Bfigstroke.jpg_5D\Figure 1

输出格式:

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

输入样例:

  1. 3 4 5 2
  2. 1 1 1 1
  3. 1 1 1 1
  4. 1 1 1 1
  5. 0 0 1 1
  6. 0 0 1 1
  7. 0 0 1 1
  8. 1 0 1 1
  9. 0 1 0 0
  10. 0 0 0 0
  11. 1 0 1 1
  12. 0 0 0 0
  13. 0 0 0 0
  14. 0 0 0 1
  15. 0 0 0 1
  16. 1 0 0 0

输出样例:

  1. 26

代码:

  1. #include<stdio.h>
  2. #include<queue>
  3. using namespace std;
  4. int n,m,k,t;
  5. int arr[1300][130][80];
  6. int visited[1300][130][80];
  7. int X[6] = {1, 0, 0, -1, 0, 0};
  8. int Y[6] = {0, 1, 0, 0, -1, 0};
  9. int Z[6] = {0, 0, 1, 0, 0, -1};
  10. struct node
  11. {
  12. int a,b,c;
  13. };
  14. int judge(int x,int y,int z)
  15. {
  16. if(x<0||x>=n||y<0||y>=m||z<0||z>=k)
  17. return 0;
  18. else if(arr[x][y][z]==0||visited[x][y][z]==1)
  19. return 0;
  20. else
  21. return 1;
  22. }
  23. int BFS(int x,int y,int z)
  24. {
  25. struct node tmp;
  26. int num=0;
  27. tmp.a=x;
  28. tmp.b=y;
  29. tmp.c=z;
  30. queue<struct node> q;
  31. q.push(tmp);
  32. visited[x][y][z]=1;
  33. while(!q.empty())
  34. {
  35. num++;
  36. struct node top=q.front();
  37. q.pop();
  38. for(int i=0;i<6;i++)
  39. {
  40. int tx=top.a+X[i];
  41. int ty=top.b+Y[i];
  42. int tz=top.c+Z[i];
  43. if(judge(tx,ty,tz)==1)
  44. {
  45. visited[tx][ty][tz]=1;
  46. tmp.a=tx;
  47. tmp.b=ty;
  48. tmp.c=tz;
  49. q.push(tmp);
  50. }
  51. }
  52. }
  53. if(num>=t)
  54. return num;
  55. else
  56. return 0;
  57. }
  58. int main()
  59. {
  60. int i,j,l,total=0;
  61. scanf("%d %d %d %d",&n,&m,&k,&t);
  62. for(i=0;i<k;i++)
  63. {
  64. for(j=0;j<n;j++)
  65. {
  66. for(l=0;l<m;l++)
  67. {
  68. scanf("%d",&arr[j][l][i]);
  69. }
  70. }
  71. }
  72. for(i=0;i<k;i++)
  73. {
  74. for(j=0;j<n;j++)
  75. {
  76. for(l=0;l<m;l++)
  77. {
  78. if(arr[j][l][i]==1&&visited[j][l][i]==0)
  79. total+=BFS(j,l,i);
  80. }
  81. }
  82. }
  83. printf("%d\n",total);
  84. return 0;
  85. }

发表评论

表情:
评论列表 (有 0 条评论,248人围观)

还没有评论,来说两句吧...

相关阅读

    相关 L3-004. 肿瘤诊断

    L3-004. 肿瘤诊断 [题目链接][Link 1] 在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环。给定病灶扫描切片中标注出的疑似肿瘤区域,请

    相关 L3-005 垃圾箱分布(30

    大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住。所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的

    相关 L3-003 社交集群(30

    在社交网络平台注册时,用户通常会输入自己的兴趣爱好,以便找到和自己兴趣相投的朋友。有部分兴趣相同的人们就形成了“社交集群”。现请你编写程序,找出所有的集群。 输入格式: 输

    相关 L3-002 堆栈(30

    大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有“入栈”(将新元素插入栈顶)和“出栈”(将栈顶元素的值返回并从堆栈中将其删除)。现请你实现一种特殊的堆栈,它多了一种操