题目链接:点击打开链接

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

输入格式:

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


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
思路:看到样例就是要广搜。题意中是立体的,所以要用三维数组存储。 还有就是 只看周围的六个方向,不带自己。
AC代码:

  1. #include<iostream>
  2. #include<queue>
  3. #include<algorithm>
  4. #include<stack>
  5. #include<string>
  6. #include<map>
  7. #include<set>
  8. #include<cstring>
  9. using namespace std;
  10. const int MAX = 1010;
  11. const int INF = 0X3f3f3f;
  12. bool arr[1300][130][80];//bool类型 不会超内存
  13. bool vis[1300][130][80];
  14. int X[6] = {1, 0, 0, -1, 0, 0};//访问周围的数组
  15. int Y[6] = {0, 1, 0, 0, -1, 0};
  16. int Z[6] = {0, 0, 1, 0, 0, -1};
  17. int n, m, l, t;
  18. struct node{
  19. int x;
  20. int y;
  21. int z;
  22. node() {}
  23. node(int _x, int _y, int _z):x(_x), y(_y), z(_z) {}
  24. };
  25. bool judge(int x, int y, int z) { //判断该点是否需要访问
  26. if(x < 0 || x >= n || y < 0 || y >= m || z < 0 || z >= l) return false;//出界
  27. if(arr[x][y][z] == false || vis[x][y][z] == true) return false;//该点为0 或者 被访问过了
  28. return true;
  29. }
  30. int bfs(int x, int y, int z) {
  31. int ans = 0;//记录周围1 的个数
  32. queue<node> q;//开队列
  33. q.push(node(x, y, z));//起点压入
  34. vis[x][y][z] = true;//标记访问过
  35. while(!q.empty()) {//不为空 就一直继续
  36. node top = q.front();//取出队首元素
  37. q.pop();//清除队首元素
  38. ++ans;//在这里累加
  39. for(int i = 0; i < 6; i++) { // 用数组来访问周围的点
  40. int newx = top.x + X[i];
  41. int newy = top.y + Y[i];
  42. int newz = top.z + Z[i];
  43. if(judge(newx, newy, newz)) { // 判断是否符合
  44. q.push(node(newx, newy, newz));//压入
  45. vis[newx][newy][newz] = true;//标记
  46. }
  47. }
  48. }
  49. return ans >= t ? ans : 0; // 满足阈值 就返回
  50. }
  51. int main() {
  52. int i, j, k;
  53. ////////////////////////////////////// i, j, k 容易弄混 厚度 应该在最外层 也不要打错
  54. cin >> n >> m >> l >> t;
  55. for(int i = 0; i < l; i++) {
  56. for(int j = 0; j < n; j++) {
  57. for(int k = 0; k < m; k++) {
  58. scanf("%d", &arr[j][k][i]);
  59. }
  60. }
  61. }
  62. int sum = 0;
  63. for(int i = 0; i < l; i++) {
  64. for(int j = 0; j < n; j++) {
  65. for(int k = 0; k < m; k++) {
  66. //这里的条件我刚开始用judge判的,出错了
  67. if(arr[j][k][i] == true && vis[j][k][i] == false) {
  68. sum += bfs(j, k, i);
  69. }
  70. }
  71. }
  72. }
  73. cout << sum;
  74. return 0;
  75. }

PAT天梯赛L3-004 肿瘤诊断的更多相关文章

  1. PAT天梯赛练习题——L3-004. 肿瘤诊断(三维连通块并查集)

    L3-004. 肿瘤诊断 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环.给定病灶 ...

  2. PAT天梯赛练习 L3-004 肿瘤诊断 (30分) 三维BFS

    题目分析: 可能是我的理解能力比较差,在读题的时候一直以为所有的切片是可以排列组合的,并不是按照输入顺序就定死的,那么这题就变得十分的复杂啦~~~~~,查看的题解之后发现所有的切片并没有所谓的自由组合 ...

  3. PAT天梯赛 L1-049 天梯赛座位分配

    题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...

  4. PAT天梯赛L3-007 天梯地图

    题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...

  5. PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  6. PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  7. PAT天梯赛练习题 L3-002. 堆栈(线段树查询第K大值或主席树)

    L3-002. 堆栈 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有 ...

  8. PAT天梯赛练习题 L3-011. 直捣黄龙(多关键字SPFA+DFS)

    L3-011. 直捣黄龙 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题是一部战争大片 —— 你需要从己方大本营出发,一路 ...

  9. PAT天梯赛练习题 L2-013 红色警报(并查集+逆序加边)

    L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...

随机推荐

  1. deepmoji:文本预测emoji

    输入句子,预测emoji demo: https://deepmoji.mit.edu/ github: https://github.com/bfelbo/DeepMoji  能够被预测的emoji ...

  2. pthread_cond_wait()用法分析

    很久没看APUE,今天一位朋友问道关于一个mutex的问题,又翻到了以前讨论过的东西,为了不让自己忘记,把曾经的东西总结一下. 先大体看下网上很多地方都有的关于pthread_cond_wait()的 ...

  3. 使用WindowsAPI实现播放PCM音频的方法

    这篇文章主要介绍了使用WindowsAPI实现播放PCM音频的方法,很实用的一个功能,需要的朋友可以参考下 本文介绍了使用WindowsAPI实现播放PCM音频的方法,同前面一篇使用WindowsAP ...

  4. Log Structured Merge Trees(LSM) 原理

    http://www.open-open.com/lib/view/open1424916275249.html

  5. JQUERYUI 框架 http://jqueryui.com/

    http://jqueryui.com/

  6. GSM/GPRS操作示例

    A6(GPRS)  博文转自安信科技: http://wiki.ai-thinker.com/gprs/examples 1.电话接收 相关指令 ATDxxxxx;//xxx为电话号码 示例 打电话 ...

  7. JUST第二界算法设计大赛题解

    1.问题描述: 悠悠假期同叔叔一起去书店,他选中了六本书,每本书的单价(单位:元)分别为:3.1,1.7,2,5.3,0.9 和7.2.不巧的是,叔叔只带了十几块钱,为了让悠悠高兴,叔叔同意买书,但提 ...

  8. java基础知识(11)---多线程

    多线程: 进程:正在进行中的程序.其实进程就是一个应用程序运行时的内存分配空间. 线程:其实就是进程中一个程序执行控制单元,一条执行路径.进程负责的是应用程序的空间的标示.线程负责的是应用程序的执行顺 ...

  9. .net关于应用程序缓存的一些疑惑

    疑惑:获取缓存后强制转换为实体对象传递给前台,如果前台对这个实体对象中属性更改的话缓存中的数据也随之改变,为啥??? 首先是创建缓存的方法: /// <summary> /// 创建缓存项 ...

  10. 报错:Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): cn.itcast.bos.domain.base.SubArea

    因为 实体类中的主键 是String类型 不能自动为其分配id  所以需要手动设置在service层   model.setId(UUID.randomUUID().toString());